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;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |