Visual Studio 编辑器可以广播“查询编辑-查询保存”(QEQS)事件。 Visual Studio 源代码管理存根实现了 QEQS 服务,使其成为 QEQS 事件的接收者。 然后将这些事件委托给当前活动的源代码管理 VSPackage。 活动源代码管理 VSPackage 实现 IVsQueryEditQuerySave2 及其方法。 接口的方法 IVsQueryEditQuerySave2 通常在第一次编辑文档之前立即调用,并在保存文档之前立即调用。
QueryEditQuerySave 事件
源代码管理 VSPackage 必须通过实现 IVsQueryEditQuerySave2 接口和必要的方法来处理 QEQS 事件。 下面是 VSPackage 必须至少实现的两种方法的简要说明。 实际实现必须符合源代码管理模型的逻辑。
QueryEditFiles 方法
QueryEditFiles当任何项目或编辑器想要修改文件时,将调用该文件。 理想情况下,在修改文件 之前 以及保存文件时调用此方法。 调用时,IVsQueryEditQuerySave2::QueryEditFiles 方法将检查给定的文件是否在源代码管理下,是否需要签出,以及是否可以重新加载这些文件。 如果情况阻止文件可编辑,该方法 IVsQueryEditQuerySave2::QueryEditFiles 会告知调用程序取消编辑。 调用方还可以指定调用模式。 在“无提示”模式下,仅当此方法不会导致任何 UI 出现时,此方法才会执行作。 如果 UI 是不可避免的,则必须返回一个标志来标识问题。
该方法的行为方式为事务性;也就是说,如果对单个文件取消了编辑,则会取消所有文件的编辑。 相反,如果允许编辑,则允许编辑所有文件。 如果此方法允许对给定的文件集进行一次编辑,则它必须始终允许对同一组文件的后续调用进行编辑。 允许编辑的循环将持续进行,直到文件关闭、保存并重新加载;直到其属性(特性)发生更改;或者直到源代码管理包被更改。 在实现 IVsQueryEditQuerySave2::QueryEditFiles 方法时需要考虑的情况包括多个文件、特殊文件、用户取消操作,以及内存中的编辑。
QuerySaveFiles 方法
QuerySaveFiles当任何项目或编辑器需要保存一组文件时,将调用它。 调用时,该方法 IVsQueryEditQuerySave2::QuerySaveFiles 将检查给定文件是否为只读文件,以及它们是否在源代码管理下。 如果需要签出文件,则会将调用委托给源代码管理包。 如果情况阻止保存文件,该方法 IVsQueryEditQuerySave2::QuerySaveFiles 必须告知编辑器取消保存。 与 IVsQueryEditQuerySave2::QueryEditFiles 该方法一样,调用方可以指定调用模式。 在“无提示”模式下,仅当此方法不会导致任何 UI 出现时,此方法才会执行作。 如果用户界面不可避免,则必须返回一个标识符来指示问题。
此方法必须以事务方式行为;也就是说,如果在单个文件上取消保存,则会为所有文件取消保存。 相反,如果允许保存,则必须允许保存所有文件。 与 IVsQueryEditQuerySave2::QueryEditFiles 方法一样,在实现 IVsQueryEditQuerySave2::QuerySaveFiles 方法时,需要考虑的案例包括多个文件、特殊文件、用户取消和内存中编辑。