保存标准文档

环境会处理“保存”、“另存为”和“全部保存”命令。 当用户从“文件”菜单选择“保存”、“另存为”或“全部保存”或关闭解决方案,导致“全部保存”时,将出现以下过程。

标准编辑器

标准编辑器的“保存”、“另存为”和“全部保存”命令处理

以下步骤中详细介绍了此过程:

  1. 当选择“保存”和“另存为”命令时,环境使用 SVsShellMonitorSelection 服务来确定活动文档窗口,以及应保存哪些项目。 活动文档窗口已知后,环境将查找正在运行的文档表中文档的层次结构指针和项标识符 (itemID)。 有关详细信息,请参阅运行文档表

    当选择“全部保存”命令时,环境将使用正在运行的文档表中的信息来编译要保存的所有项的列表。

  2. 当解决方案收到 QueryStatus 调用时,它会循环访问所选项的集合(即 SVsShellMonitorSelection 服务公开的多个选择)。

  3. 在所选内容中的每个项上,解决方案使用层次结构指针调用 IsItemDirty 方法,以确定是否应启用“保存”菜单命令。 如果一个或多个项变脏,则启用“保存”命令。 如果层次结构使用标准编辑器,则层次结构通过调用 IsDocDataDirty 方法将查询脏状态委托给编辑器。

  4. 在变脏的每个选定项上,解决方案使用层次结构指针对相应的层次结构调用 SaveItem 方法。

    层次结构通常会使用标准编辑器编辑文档。 在这种情况下,该编辑器的文档数据对象应支持 IVsPersistDocData2 接口。 收到 SaveItem 方法调用后,项目应通过对文档数据对象调用 SaveDocData 方法,通知编辑器正在保存文档。 通过调用 SVsUIShell 接口的 Query Service,编辑器可以允许环境处理“另存为”对话框。 这会返回指向 IVsUIShell 接口的指针。 然后,编辑器必须调用 SaveDocDataToFile 方法,并通过 pPersistFile 参数将指针传递给编辑器的 IPersistFileFormat 实现。 然后,环境将执行“保存”操作,并为编辑器提供“另存为”对话框。 然后环境通过 IPersistFileFormat 回调编辑器。

  5. 如果用户尝试保存无标题文档(即以前未保存的文档),实际执行“另存为”命令。

  6. 对于“另存为”命令,环境会显示“另存为”对话框,提示用户输入文件名。

    如果文件的名称已更改,则层次结构负责通过调用 SetProperty(VSFPROPID_MkDocument) 来更新文档框架的缓存信息。

    如果“另存为”命令移动文档的位置,并且层次结构对文档位置敏感,则层次结构负责将打开的文档窗口的所有权移交给另一个层次结构。 例如,如果项目跟踪文件与项目相关的是内部文件还是外部文件(杂项文件),则会出现这种情况。 使用以下过程,将文件的所有权更改为“杂项文件”项目。

更改文件所有权

将文件所有权更改为“杂项文件”项目

  1. SVsExternalFilesManager 接口的查询服务。

    返回指向 IVsExternalFilesManager2 的指针。

  2. 调用 TransferDocument (pszMkDocumentNewpunkWindowFrame) 方法,将文档传输到新层次结构。 执行“另存为”命令的层次结构调用此方法。