/// <summary>
        /// This method scans the given SnapshotSpan for potential matches for this classification.
        /// In this instance, it classifies everything and returns each span as a new ClassificationSpan.
        /// </summary>
        /// <param name="trackingSpan">The span currently being classified</param>
        /// <returns>A list of ClassificationSpans that represent spans identified to be of this classification</returns>
        public IList<ClassificationSpan> GetClassificationSpans(SnapshotSpan span)
        {
            List<ClassificationSpan> classifications = new List<ClassificationSpan>();

            /*
             * Comment Classifications
             */
            if (span.IsComment())
                classifications.Add(new ClassificationSpan(span, _commentClassificationType));

            /*
             * Keyword Classifications
             */
            if (span.IsCommand())
            {
                string command = span.GetCommand();
                classifications.Add(new ClassificationSpan(new SnapshotSpan(span.Start, command.Length), _keywordClassificationType));
            }

            return classifications;
        }
        private void OnKeyDown(object sender, KeyEventArgs e)
        {
            // Make sure that this event happened on the same text view to which we're attached.
            ITextView textView = sender as ITextView;
            if (this.subjectTextView != textView)
                return;

            // if there is a session already leave it be
            if (activeSession != null)
                return;

            // determine which subject buffer is affected by looking at the caret position
            SnapshotPoint? caret = textView.Caret.Position.Point.GetPoint(textBuffer => (
                    subjectBuffers.Contains(textBuffer)),
                    PositionAffinity.Predecessor);

            // return if no suitable buffer found
            if (!caret.HasValue)
                return;

            SnapshotPoint caretPoint = caret.Value;
            ITextSnapshotLine line = caretPoint.GetContainingLine();
            SnapshotSpan span = new SnapshotSpan(line.Start, line.End);

            if (span.IsComment() || span.IsCommand())
                return;

            // the invocation occurred in a subject buffer of interest to us
            triggerPosition = caretPoint.Position;
            ITrackingPoint triggerPoint = caretPoint.Snapshot.CreateTrackingPoint(triggerPosition, PointTrackingMode.Negative);
            completionSpan = caretPoint.Snapshot.CreateTrackingSpan(caretPoint.Position, 0, SpanTrackingMode.EdgeInclusive);

            // Create a completion session
            activeSession = completionBroker.CreateCompletionSession(textView, triggerPoint, true);

            // Put the completion context and original (empty) completion span
            // on the session so that it can be used by the completion source
            activeSession.Properties.AddProperty(typeof(ApacheIntellisenseController), completionSpan);

            // Attach to the session events
            activeSession.Dismissed += new System.EventHandler(OnActiveSessionDismissed);
            activeSession.Committed += new System.EventHandler(OnActiveSessionCommitted);

            // Start the completion session. The intellisense will be triggered.
            activeSession.Start();
        }
 public static bool IsComment(this ITextSnapshotLine line)
 {
     SnapshotSpan span = new SnapshotSpan(line.Start, line.End);
     return span.IsComment();
 }