环境处理“保存”、“另存为”和“保存所有”命令。 当用户从“文件”菜单中选择“保存”、“另存为”或“全部保存”或关闭解决方案时,将发生以下过程。
标准编辑器的“保存”、“另存为”和“保存所有”命令处理
以下步骤详细介绍了此过程:
选择“保存”和“另存为”命令时,环境使用SVsShellMonitorSelection服务来确定活动文档窗口,从而决定应保存哪些项目。 在确定了活动文档窗口后,环境会在正在运行文档表中找到该文档的层次结构指针和项标识符(itemID)。 有关详细信息,请参阅 “运行文档表”。
选择“ 全部保存 ”命令后,环境将使用正在运行的文档表中的信息来编译要保存的所有项的列表。
当解决方案收到 QueryStatus 调用时,它会遍历所选项目的集合(即由 SVsShellMonitorSelection 服务提供的多个选择)。
在所选内容中的每个项上,解决方案使用层次结构指针调用 IsItemDirty 方法,以确定是否应启用 “保存 ”菜单命令。 如果一个或多个项很脏,则启用 “保存” 命令。 如果层次结构使用标准编辑器,则应该通过调用方法 IsDocDataDirty 来将脏状态查询委托给编辑器。
对于每个被标记为“脏”的选定项,解决方案利用层次结构指针在相应的层次结构上调用SaveItem 方法。
层次结构通常使用标准编辑器编辑文档。 在这种情况下,该编辑器的文档数据对象应支持 IVsPersistDocData2 该接口。 收到 SaveItem 方法调用后,项目应通过对文档数据对象调用 SaveDocData 方法通知编辑器正在保存文档。 通过调用
Query Service接口,编辑器可以允许环境处理SVsUIShell”对话框。 这会返回指向接口的 IVsUIShell 指针。 然后,编辑器必须调用SaveDocDataToFile该方法,并通过IPersistFileFormat参数将指针传递给编辑器的pPersistFile实现。 然后,环境将执行“保存”作,并为编辑器提供 “另存为 ”对话框。 然后,环境回调到编辑器,使用 IPersistFileFormat.如果用户尝试保存无标题文档(即以前未保存的文档),则实际执行“另存为”命令。
对于“另存为”命令,环境将显示“另存为”对话框,提示用户输入文件名。
如果文件的名称已更改,则层次结构负责通过调用 SetProperty(VSFPROPID_MkDocument)来更新文档框架的缓存信息。
如果 “另存为 ”命令移动文档的位置,并且层次结构对文档位置敏感,则层次结构负责将打开的文档窗口的所有权移交给另一个层次结构。 例如,如果项目跟踪文件是与项目相关的内部文件还是外部文件(杂项文件),则会出现这种情况。 使用以下过程将文件的所有权更改为“杂项文件”项目。
更改文件所有权
将文件所有权更改为“杂项文件项目”
SVsExternalFilesManager 接口查询服务。
返回指向 IVsExternalFilesManager2 的指针。
调用 TransferDocument (
pszMkDocumentNew,punkWindowFrame) 方法将文档传输到新层次结构。 执行另存为命令的层次结构调用此方法。