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