技术开发 频道

将基于 Swing 的开发工具插入 Eclipse 中

  传统的编辑器将在平面文件、二进制资源库中保存源代码,或者将源代码保存到源代码控制系统中。作为一个编辑器,Ed 需要一些方法来保存它显示的对源代码的更改。

  Ed 有一个“Save”按钮( JButton),如 Swing 编辑器:Ed 中所描述。按下按钮后, actionPerformed() 方法被调用,Save 按钮触发一个事件。实现一个事件侦听器的对象接收事件并执行源代码保存操作。

  您可以用 Singleton 实用程序类作为实现事件侦听器的对象。实用程序类一接收到来自 Save 按钮的事件对象,就从 Ed 中抽取源代码,然后将源代码放入对应的 Workbench 对象中。保存到文件系统的实际工作被委托给 Eclipse Platform。

  多个文件在 Workbench 中可能拥有相同的名称。这就是 ThirdParty.java 的项目名称和包名称有用的地方。该信息由插件存储。确切的实现方式由您决定。假定编辑器存储信息,您可以在实用程序类中使用下列代码片段(snippet):

  清单 3. 管理文件名称

1 public void saveButtonPressed() {
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. 过滤不相关的源代码更改

1 IJavaElementDelta delta = event.getDelta();
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 资源所作的更改。

0
相关文章