E4 - 使用Model Fragments扩展视图

      E4中可以使用简单的POJO类替代3.x的ViewPart子类作为视图对象,这样的话就不能使用org.eclipse.ui.views扩展点指定视图类了。

      其实我个人觉得E4的Model Fragments更灵活,我们将做一个简单例子试用一下。

      测试场景:

  1. 一个主E4工程,比如"vwpolo.demo.client”(包含Application.e4xmi、MainView视图)
  2. 一个附属插件工程”vwpolo.demo.view1”(包含fragment.e4xmi、SimpleView视图)

      测试目的:将SimpleView视图添加到"vwpolo.demo.client”的透视图中(和MainView平级)。

 

创建vwpolo.demo.client

       新建一个E4工程,命名为”vwpolo.demo.client”。再新建一个MainView视图。

package vwpolo.demo.client.views;

import javax.inject.Inject;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;

public class MainView {

private final Composite parent;

@Inject // E4将会注入parent组件到视图中
public MainView(Composite parent) {
this.parent = parent;

final GridLayout layout = new GridLayout(2, false);
parent.setLayout(layout);

createLabel("作者");
createText("vwpolo");
createLabel("日期");
createText("2011-07-22");
}

private void createLabel(String text) {
Label label = new Label(parent, SWT.NONE);
label.setText(text);
GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gridData.horizontalIndent = 20;
label.setLayoutData(gridData);
}

private void createText(String text) {
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
Text textField = new Text(parent, SWT.NONE);
textField.setText(text);
textField.setLayoutData(gridData);
}
}

      然后将MainView视图注册到Application.e4xmi文件中。

      展开到Part Stack节点,

image

   为Part Stack指定id:”client.partstack”,并添加子节点:“Part”组件。

image

然后编辑“Part”组件属性,设置ID、Label属性,在Class URI属性指定MainView视图,

image

运行看下效果:

image

 

创建vwpolo.demo.view1

       创建一个空Plug-in Project,命名为”vwpolo.demo.view1”.添加依赖项工程:javax.inject。再添加一个SimpleView视图。

package vwpolo.demo.view1.views;
import javax.inject.Inject;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;

public class SimpleView {

private final Composite parent;

@Inject
public SimpleView(Composite parent) {
this.parent = parent;

final GridLayout layout = new GridLayout(2, false);
parent.setLayout(layout);

Button helloWorld = new Button(parent, SWT.NONE);
helloWorld.setText("Hello World");
}
}

  使用“New Model Fragment”向导生成vwpolo.demo.view1工程的fragment.e4xmi文件

image

   打开fragment.e4xmi文件,在Model Fragments新增一个”String Model Fragment”节点.

image

双击打开。

点击“Element Id”后面的”Find…”按钮,选择PartStack。

image

点击 OK 按钮后,会列出工作区中注册的PartStack组件。选择id为“client.partstack”的Part Stack。

image

   点击Featurename的“Find…”按钮,选择basic –> PartStack –> children节点。

image

接下来再添加一个Part组件

image

   编辑Part组件信息:在Class URI中指定SimpleView视图。

image

 

增加org.eclipse.e4.workbench.model扩展点

      为插件”vwpolo.demo.view1”增加”org.eclipse.e4.workbench.model”扩展点.

image

最终:

image

 

运行测试

    将插件vwpolo.demo.view1加入到vwpolo.demo.client的.product文件中,打开运行配置对话框,添加依赖插件,运行

image

 

    我们的SimpleView视图被加入到vwpolo.demo.client项目的透视图中了。

    然后发挥你的想象力吧,其他组件可使用同样方式扩展。

posted @ 2011-07-22 15:21  vwpolo  阅读(1807)  评论(1编辑  收藏  举报