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