1 | using EnvDTE; |
2 | using Microsoft.VisualStudio; |
3 | using Microsoft.VisualStudio.Shell; |
4 | using Microsoft.VisualStudio.Shell.Interop; |
5 | using System.Linq; |
6 | |
7 | namespace 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 | } |
80 | |