Home | History | Annotate | Line # | Download | only in ClangFormat
      1 using EnvDTE;
      2 using Microsoft.VisualStudio.Editor;
      3 using Microsoft.VisualStudio.Shell;
      4 using Microsoft.VisualStudio.Shell.Interop;
      5 using Microsoft.VisualStudio.Text;
      6 using Microsoft.VisualStudio.Text.Editor;
      7 using Microsoft.VisualStudio.TextManager.Interop;
      8 using System;
      9 using System.IO;
     10 
     11 namespace LLVM.ClangFormat
     12 {
     13     internal sealed class Vsix
     14     {
     15         /// <summary>
     16         /// Returns the currently active view if it is a IWpfTextView.
     17         /// </summary>
     18         public static IWpfTextView GetCurrentView()
     19         {
     20             // The SVsTextManager is a service through which we can get the active view.
     21             var textManager = (IVsTextManager)Package.GetGlobalService(typeof(SVsTextManager));
     22             IVsTextView textView;
     23             textManager.GetActiveView(1, null, out textView);
     24 
     25             // Now we have the active view as IVsTextView, but the text interfaces we need
     26             // are in the IWpfTextView.
     27             return VsToWpfTextView(textView);
     28         }
     29 
     30         public static bool IsDocumentDirty(Document document)
     31         {
     32             var textView = GetDocumentView(document);
     33             var textDocument = GetTextDocument(textView);
     34             return textDocument?.IsDirty == true;
     35         }
     36 
     37         public static IWpfTextView GetDocumentView(Document document)
     38         {
     39             var textView = GetVsTextViewFrompPath(document.FullName);
     40             return VsToWpfTextView(textView);
     41         }
     42 
     43         public static IWpfTextView VsToWpfTextView(IVsTextView textView)
     44         {
     45             var userData = (IVsUserData)textView;
     46             if (userData == null)
     47                 return null;
     48             Guid guidWpfViewHost = DefGuidList.guidIWpfTextViewHost;
     49             object host;
     50             userData.GetData(ref guidWpfViewHost, out host);
     51             return ((IWpfTextViewHost)host).TextView;
     52         }
     53 
     54         public static IVsTextView GetVsTextViewFrompPath(string filePath)
     55         {
     56             // From http://stackoverflow.com/a/2427368/4039972
     57             var dte2 = (EnvDTE80.DTE2)Package.GetGlobalService(typeof(SDTE));
     58             var sp = (Microsoft.VisualStudio.OLE.Interop.IServiceProvider)dte2;
     59             var serviceProvider = new Microsoft.VisualStudio.Shell.ServiceProvider(sp);
     60 
     61             IVsUIHierarchy uiHierarchy;
     62             uint itemID;
     63             IVsWindowFrame windowFrame;
     64             if (VsShellUtilities.IsDocumentOpen(serviceProvider, filePath, Guid.Empty,
     65                 out uiHierarchy, out itemID, out windowFrame))
     66             {
     67                 // Get the IVsTextView from the windowFrame.
     68                 return VsShellUtilities.GetTextView(windowFrame);
     69             }
     70             return null;
     71         }
     72 
     73         public static ITextDocument GetTextDocument(IWpfTextView view)
     74         {
     75             ITextDocument document;
     76             if (view != null && view.TextBuffer.Properties.TryGetProperty(typeof(ITextDocument), out document))
     77                 return document;
     78             return null;
     79         }
     80 
     81         public static string GetDocumentParent(IWpfTextView view)
     82         {
     83             ITextDocument document = GetTextDocument(view);
     84             if (document != null)
     85             {
     86                 return Directory.GetParent(document.FilePath).ToString();
     87             }
     88             return null;
     89         }
     90 
     91         public static string GetDocumentPath(IWpfTextView view)
     92         {
     93             return GetTextDocument(view)?.FilePath;
     94         }
     95     }
     96 }
     97