传统的编辑器将在平面文件、二进制资源库中保存源代码,或者将源代码保存到源代码控制系统中。作为一个编辑器,Ed 需要一些方法来保存它显示的对源代码的更改。
Ed 有一个“Save”按钮( JButton),如 Swing 编辑器:Ed 中所描述。按下按钮后, actionPerformed() 方法被调用,Save 按钮触发一个事件。实现一个事件侦听器的对象接收事件并执行源代码保存操作。
您可以用 Singleton 实用程序类作为实现事件侦听器的对象。实用程序类一接收到来自 Save 按钮的事件对象,就从 Ed 中抽取源代码,然后将源代码放入对应的 Workbench 对象中。保存到文件系统的实际工作被委托给 Eclipse Platform。
多个文件在 Workbench 中可能拥有相同的名称。这就是 ThirdParty.java 的项目名称和包名称有用的地方。该信息由插件存储。确切的实现方式由您决定。假定编辑器存储信息,您可以在实用程序类中使用下列代码片段(snippet):
清单 3. 管理文件名称
2 try {
3 IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
4
5 IProject myProj = root.getProject(getEd().getProjectname());
6
7 IFolder myFolder = myProj.getFolder(getEd().getPackageName());
8
9 IJavaElement myPackageFragment = JavaCore.create(myFolder);
10
11 if (myPackageFragment != null) {
12 IPackageFragment packageFrag = (IPackageFragment)myPackageFragment;
13
14 String sourceFromEd = getEd().getJEditorPane1().getText();
15
16 ICompilationUnit icu = packageFrag.getCompilationUnit("ThirdParty.java");
17
18 icu.getBuffer().setContents(sourceFromValidator);
19
20 icu.save(null, true);
21 }
22 else {
23 System.out.println("myPackageFragment is null.");
24 }
25 } catch (Exception e) {
26 e.printStackTrace();
27 }
28 }
29
逆向进行双向传递
清单 3 处理“正向”双向传递。还需要“反向”双向传递来把用 Eclipse Platform 的 JDT Java 编辑器在 ThirdParty.java 中所作的任何更改带回到 Ed。
实用程序类可以实现接口 org.eclipse.jdt.core.IElementChangedListener ,您可以用这个接口跟踪对任何 IElements(包括 ICompilationUnit)作的更改。当源代码更改被引入到 Workbench 中的 Java 文件内时,调用方法 elementChanged(ElementChangedEvent) 。
您需要有选择地过滤出那些不涉及 Ed 插件的 IElement 更改。一种过滤方式是从 IElementChangedEvent 参数中抽取 IJavaElementDelta 对象并对其进行检查。例如,下面的语句过滤 Ed 插件情况下不相关的源代码更改。
清单 4. 过滤不相关的源代码更改
2 if (delta != null) {
3 if(delta.getElement().getElementName().equalsIgnoreCase("ThirdParty.java")) {
4 //code to update Ed's editor panel.
5 }
6 }
7
对于非 Java 构件的编辑器,IElementChangedListener 不能捕获在 Workbench 中所作的更改。Eclipse Platform 提供接口 org.eclipse.core.resources.IResourceChangeListener 来处理对非 Java 资源所作的更改。