Antonio Maiorano | a16ab5a | 2017-04-05 14:13:45 +0000 | [diff] [blame] | 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 | } |