80 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C#
		
	
	
	
| using EnvDTE;
 | |
| using Microsoft.VisualStudio;
 | |
| using Microsoft.VisualStudio.Shell;
 | |
| using Microsoft.VisualStudio.Shell.Interop;
 | |
| using System.Linq;
 | |
|     
 | |
| namespace LLVM.ClangFormat
 | |
| {
 | |
|     // Exposes event sources for IVsRunningDocTableEvents3 events.
 | |
|     internal sealed class RunningDocTableEventsDispatcher : IVsRunningDocTableEvents3
 | |
|     {
 | |
|         private RunningDocumentTable _runningDocumentTable;
 | |
|         private DTE _dte;
 | |
| 
 | |
|         public delegate void OnBeforeSaveHander(object sender, Document document);
 | |
|         public event OnBeforeSaveHander BeforeSave;
 | |
| 
 | |
|         public RunningDocTableEventsDispatcher(Package package)
 | |
|         {
 | |
|             _runningDocumentTable = new RunningDocumentTable(package);
 | |
|             _runningDocumentTable.Advise(this);
 | |
|             _dte = (DTE)Package.GetGlobalService(typeof(DTE));
 | |
|         }
 | |
| 
 | |
|         public int OnAfterAttributeChange(uint docCookie, uint grfAttribs)
 | |
|         {
 | |
|             return VSConstants.S_OK;
 | |
|         }
 | |
| 
 | |
|         public int OnAfterAttributeChangeEx(uint docCookie, uint grfAttribs, IVsHierarchy pHierOld, uint itemidOld, string pszMkDocumentOld, IVsHierarchy pHierNew, uint itemidNew, string pszMkDocumentNew)
 | |
|         {
 | |
|             return VSConstants.S_OK;
 | |
|         }
 | |
| 
 | |
|         public int OnAfterDocumentWindowHide(uint docCookie, IVsWindowFrame pFrame)
 | |
|         {
 | |
|             return VSConstants.S_OK;
 | |
|         }
 | |
| 
 | |
|         public int OnAfterFirstDocumentLock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
 | |
|         {
 | |
|             return VSConstants.S_OK;
 | |
|         }
 | |
| 
 | |
|         public int OnAfterSave(uint docCookie)
 | |
|         {
 | |
|             return VSConstants.S_OK;
 | |
|         }
 | |
| 
 | |
|         public int OnBeforeDocumentWindowShow(uint docCookie, int fFirstShow, IVsWindowFrame pFrame)
 | |
|         {
 | |
|             return VSConstants.S_OK;
 | |
|         }
 | |
| 
 | |
|         public int OnBeforeLastDocumentUnlock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
 | |
|         {
 | |
|             return VSConstants.S_OK;
 | |
|         }
 | |
| 
 | |
|         public int OnBeforeSave(uint docCookie)
 | |
|         {
 | |
|             if (BeforeSave != null)
 | |
|             {
 | |
|                 var document = FindDocumentByCookie(docCookie);
 | |
|                 if (document != null) // Not sure why this happens sometimes
 | |
|                 {
 | |
|                     BeforeSave(this, FindDocumentByCookie(docCookie));
 | |
|                 }
 | |
|             }
 | |
|             return VSConstants.S_OK;
 | |
|         }
 | |
| 
 | |
|         private Document FindDocumentByCookie(uint docCookie)
 | |
|         {
 | |
|             var documentInfo = _runningDocumentTable.GetDocumentInfo(docCookie);
 | |
|             return _dte.Documents.Cast<Document>().FirstOrDefault(doc => doc.FullName == documentInfo.Moniker);
 | |
|         }
 | |
|     }
 | |
| }
 |