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