blob: 163f68dbda3cb4f3448aa3f1b83aeda613525a56 [file] [log] [blame]
Antonio Maioranoa16ab5a2017-04-05 14:13:45 +00001using EnvDTE;
2using Microsoft.VisualStudio;
3using Microsoft.VisualStudio.Shell;
4using Microsoft.VisualStudio.Shell.Interop;
5using System.Linq;
6
7namespace LLVM.ClangFormat
8{
9 // Exposes event sources for IVsRunningDocTableEvents3 events.
10 internal sealed class RunningDocTableEventsDispatcher : IVsRunningDocTableEvents3
11 {
12 private RunningDocumentTable _runningDocumentTable;
13 private DTE _dte;
14
15 public delegate void OnBeforeSaveHander(object sender, Document document);
16 public event OnBeforeSaveHander BeforeSave;
17
18 public RunningDocTableEventsDispatcher(Package package)
19 {
20 _runningDocumentTable = new RunningDocumentTable(package);
21 _runningDocumentTable.Advise(this);
22 _dte = (DTE)Package.GetGlobalService(typeof(DTE));
23 }
24
25 public int OnAfterAttributeChange(uint docCookie, uint grfAttribs)
26 {
27 return VSConstants.S_OK;
28 }
29
30 public int OnAfterAttributeChangeEx(uint docCookie, uint grfAttribs, IVsHierarchy pHierOld, uint itemidOld, string pszMkDocumentOld, IVsHierarchy pHierNew, uint itemidNew, string pszMkDocumentNew)
31 {
32 return VSConstants.S_OK;
33 }
34
35 public int OnAfterDocumentWindowHide(uint docCookie, IVsWindowFrame pFrame)
36 {
37 return VSConstants.S_OK;
38 }
39
40 public int OnAfterFirstDocumentLock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
41 {
42 return VSConstants.S_OK;
43 }
44
45 public int OnAfterSave(uint docCookie)
46 {
47 return VSConstants.S_OK;
48 }
49
50 public int OnBeforeDocumentWindowShow(uint docCookie, int fFirstShow, IVsWindowFrame pFrame)
51 {
52 return VSConstants.S_OK;
53 }
54
55 public int OnBeforeLastDocumentUnlock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
56 {
57 return VSConstants.S_OK;
58 }
59
60 public int OnBeforeSave(uint docCookie)
61 {
62 if (BeforeSave != null)
63 {
64 var document = FindDocumentByCookie(docCookie);
65 if (document != null) // Not sure why this happens sometimes
66 {
67 BeforeSave(this, FindDocumentByCookie(docCookie));
68 }
69 }
70 return VSConstants.S_OK;
71 }
72
73 private Document FindDocumentByCookie(uint docCookie)
74 {
75 var documentInfo = _runningDocumentTable.GetDocumentInfo(docCookie);
76 return _dte.Documents.Cast<Document>().FirstOrDefault(doc => doc.FullName == documentInfo.Moniker);
77 }
78 }
79}