//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Copyright (c) Microsoft Corporation. All rights reserved. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// using System; using System.Collections.Generic; using System.Windows.Input; using Microsoft.VisualStudio.Language.Intellisense; using Microsoft.VisualStudio.Text; using Microsoft.VisualStudio.Text.Editor; using Microsoft.VisualStudio.Utilities; namespace VSLTK.Intellisense { #region IIntellisenseController internal class TemplateQuickInfoController : IIntellisenseController { #region Private Data Members private ITextView _textView; private IList _subjectBuffers; private TemplateQuickInfoControllerProvider _componentContext; private IQuickInfoSession _session; #endregion #region Constructors internal TemplateQuickInfoController(ITextView textView, IList subjectBuffers, TemplateQuickInfoControllerProvider componentContext) { _textView = textView; _subjectBuffers = subjectBuffers; _componentContext = componentContext; _textView.MouseHover += this.OnTextViewMouseHover; } #endregion #region IIntellisenseController Members public void ConnectSubjectBuffer(ITextBuffer subjectBuffer) { } public void DisconnectSubjectBuffer(ITextBuffer subjectBuffer) { } public void Detach(ITextView textView) { if (_textView == textView) { _textView.MouseHover -= this.OnTextViewMouseHover; _textView = null; } } #endregion #region Event Handlers private void OnTextViewMouseHover(object sender, MouseHoverEventArgs e) { SnapshotPoint? point = this.GetMousePosition(new SnapshotPoint(_textView.TextSnapshot, e.Position)); if (point != null) { ITrackingPoint triggerPoint = point.Value.Snapshot.CreateTrackingPoint(point.Value.Position, PointTrackingMode.Positive); // Find the broker for this buffer if (!_componentContext.QuickInfoBroker.IsQuickInfoActive(_textView)) { _session = _componentContext.QuickInfoBroker.CreateQuickInfoSession(_textView, triggerPoint, true); _session.Start(); } } } #endregion #region Private Implementation private SnapshotPoint? GetMousePosition(SnapshotPoint topPosition) { // Map this point down to the appropriate subject buffer. return _textView.BufferGraph.MapDownToFirstMatch ( topPosition, PointTrackingMode.Positive, snapshot => _subjectBuffers.Contains(snapshot.TextBuffer), PositionAffinity.Predecessor ); } #endregion } #endregion }