using EnvDTE;
using Microsoft.VisualStudio.Editor;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Editor;
using Microsoft.VisualStudio.TextManager.Interop;
using System;
using System.IO;
namespace LLVM.ClangFormat
{
internal sealed class Vsix
{
/// <summary>
/// Returns the currently active view if it is a IWpfTextView.
/// </summary>
public static IWpfTextView GetCurrentView()
{
// The SVsTextManager is a service through which we can get the active view.
var textManager = (IVsTextManager)Package.GetGlobalService(typeof(SVsTextManager));
IVsTextView textView;
textManager.GetActiveView(1, null, out textView);
// Now we have the active view as IVsTextView, but the text interfaces we need
// are in the IWpfTextView.
return VsToWpfTextView(textView);
}
public static bool IsDocumentDirty(Document document)
{
var textView = GetDocumentView(document);
var textDocument = GetTextDocument(textView);
return textDocument?.IsDirty == true;
}
public static IWpfTextView GetDocumentView(Document document)
{
var textView = GetVsTextViewFrompPath(document.FullName);
return VsToWpfTextView(textView);
}
public static IWpfTextView VsToWpfTextView(IVsTextView textView)
{
var userData = (IVsUserData)textView;
if (userData == null)
return null;
Guid guidWpfViewHost = DefGuidList.guidIWpfTextViewHost;
object host;
userData.GetData(ref guidWpfViewHost, out host);
return ((IWpfTextViewHost)host).TextView;
}
public static IVsTextView GetVsTextViewFrompPath(string filePath)
{
// From http://stackoverflow.com/a/2427368/4039972
var dte2 = (EnvDTE80.DTE2)Package.GetGlobalService(typeof(SDTE));
var sp = (Microsoft.VisualStudio.OLE.Interop.IServiceProvider)dte2;
var serviceProvider = new Microsoft.VisualStudio.Shell.ServiceProvider(sp);
IVsUIHierarchy uiHierarchy;
uint itemID;
IVsWindowFrame windowFrame;
if (VsShellUtilities.IsDocumentOpen(serviceProvider, filePath, Guid.Empty,
out uiHierarchy, out itemID, out windowFrame))
{
// Get the IVsTextView from the windowFrame.
return VsShellUtilities.GetTextView(windowFrame);
}
return null;
}
public static ITextDocument GetTextDocument(IWpfTextView view)
{
ITextDocument document;
if (view != null && view.TextBuffer.Properties.TryGetProperty(typeof(ITextDocument), out document))
return document;
return null;
}
public static string GetDocumentParent(IWpfTextView view)
{
ITextDocument document = GetTextDocument(view);
if (document != null)
{
return Directory.GetParent(document.FilePath).ToString();
}
return null;
}
public static string GetDocumentPath(IWpfTextView view)
{
return GetTextDocument(view)?.FilePath;
}
}
}