llvm-project/clang/tools/clang-format-vs/ClangFormat/RunningDocTableEventsDispatcher.cs
Antonio Maiorano a16ab5aee5 clang-format-vsix: Add "Format on Save" feature
This change adds a feature to the clang-format VS extension that optionally
enables the automatic formatting of documents when saving. Since developers
always need to save their files, this eases the workflow of making sure source
files are properly formatted.

Differential Revision: https://reviews.llvm.org/D29221

llvm-svn: 299543
2017-04-05 14:13:45 +00:00

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);
}
}
}