forked from OSchip/llvm-project
97 lines
3.4 KiB
C#
97 lines
3.4 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|