如何实现Eclipse默认编辑器编辑.graph文件时生成关联XML与Properties文件?
可行方案:监听
.graph文件保存并触发关联文件生成 当然有办法实现你的需求!核心思路是让Eclipse在.graph文件被任何编辑器保存时,自动执行你原本在GEF Editor里的XML和Properties文件生成逻辑。下面是几个经过验证的实现方向,你可以根据项目情况选择:
方案1:使用Eclipse资源变更监听器(IResourceChangeListener)
这是最直接的方式,通过监听Eclipse工作区中资源的变化,捕捉.graph文件的保存事件:
- 注册监听器:在你的插件激活时(比如
Activator的start方法)注册资源监听器:@Override public void start(BundleContext context) throws Exception { super.start(context); ResourcesPlugin.getWorkspace().addResourceChangeListener(new MyGraphResourceListener(), IResourceChangeEvent.POST_CHANGE); } - 实现监听器逻辑:在
resourceChanged方法中筛选出.graph文件的保存事件,然后调用你的生成逻辑:public class MyGraphResourceListener implements IResourceChangeListener { @Override public void resourceChanged(IResourceChangeEvent event) { IResourceDelta delta = event.getDelta(); if (delta == null) return; // 遍历所有变更的资源 delta.accept(delta -> { IResource resource = delta.getResource(); // 判断是否是.graph文件且发生了保存(CHANGE事件) if (resource.getType() == IResource.FILE && ".graph".equals(resource.getFileExtension()) && (delta.getKind() & IResourceDelta.CHANGED) != 0) { // 调用你原本在GEF Editor里的生成XML和Properties文件的方法 generateAssociatedFiles((IFile) resource); } return true; }); } } - 注意点:要记得在插件停止时移除监听器,避免内存泄漏。
方案2:利用Eclipse保存参与者(Save Participant)
这个方案更贴合Eclipse的编辑器保存生命周期,专门用于在文件保存后执行自定义逻辑,不管用户用哪个编辑器打开文件:
- 扩展
org.eclipse.ui.saveParticipants扩展点:在你的插件plugin.xml中添加如下配置:<extension point="org.eclipse.ui.saveParticipants"> <saveParticipant class="com.yourpackage.GraphSaveParticipant" id="com.yourpackage.graphSaveParticipant"> <enabledWhen> <instanceof value="org.eclipse.core.resources.IFile"/> <test property="org.eclipse.core.resources.name" value="*.graph"/> </enabledWhen> </saveParticipant> </extension> - 实现
ISaveParticipant接口:在save方法中执行你的生成逻辑:public class GraphSaveParticipant implements ISaveParticipant { @Override public void save(IWorkbenchPart part, ISaveContext context) throws CoreException { IFile graphFile = (IFile) context.getResource(); // 调用生成关联文件的逻辑 generateAssociatedFiles(graphFile); context.done(); } // 实现其他必要方法(如initialize、rollback等) } - 优势:这个机制只会在文件被编辑器主动保存时触发,比资源监听器更精准,不会捕获其他类型的资源变更(比如文件被外部工具修改)。
方案3:绑定自定义内容类型与保存处理器
如果你的.graph文件有特定的格式,可以先定义它的内容类型,再关联保存处理器:
- 定义
.graph内容类型:扩展org.eclipse.core.contenttype.contentTypes,指定文件扩展名和内容检测逻辑。 - 关联保存逻辑:结合上面的Save Participant,或者通过自定义文档提供者(
IDocumentProvider),让所有编辑该内容类型的编辑器在保存时触发你的生成逻辑。
通用注意事项
- 幂等性:确保你的生成逻辑是幂等的,即多次执行不会导致错误或不必要的文件覆盖(比如对比文件内容变化后再决定是否生成)。
- 异常处理:在生成逻辑中添加异常捕获,避免因为生成失败导致用户的保存操作被中断。
- 性能优化:如果生成逻辑比较耗时,可以考虑用后台任务(
Job)执行,避免阻塞UI线程。
内容的提问来源于stack exchange,提问作者N-G




