GEF TreeViewer使用

GEF的ContentOutlinePage就是TreeViewer使用的例子.

下面直接贴代码, 有空再进行整理:

第一段代码, 在SWT的Composite的界面上添加一个GEF的TreeViewer.
		treeViewer = new org.eclipse.gef.ui.parts.TreeViewer();
		treeViewer.createControl(composite);


第二段代码: 设置TreeViewer
		treeViewer.setEditDomain(new EditDomain());
		RootTreeEditPart rootTreeEditPart = new RootTreeEditPart();
		rootTreeEditPart.setWidget((Tree) treeViewer.getControl()); // 注意这里
		treeViewer.setRootEditPart(rootTreeEditPart);
		treeViewer.setEditPartFactory(new TreeEditPartFactory());
		treeViewer.setContents(templateModel); // 模型
		
		getSynchronizer().addViewer(treeViewer); // getSynchronizer()是一个SelectionSynchronizer.


第三段代码: TreeViewer的EditPartFactory. [很简单告诉TreeViewer怎么从Model得到TreeEditPart]
public class TreeEditPartFactory implements EditPartFactory {
	/**
	 * @see org.eclipse.gef.EditPartFactory#createEditPart(org.eclipse.gef.EditPart, java.lang.Object)
	 */
	public EditPart createEditPart(EditPart context, Object model) {
		EditPart part = null;
		if (model instanceof TemplateModel) {
			part = new TemplateTreeEditPart(); 
		}
		if (part != null) {
			part.setModel(model);
		}
		return part;
	}
}


第四部分: 一个基本的TreeEditPart的定义.
直接继承于AbstractTreeEditPart. 也可以按照需要去覆盖里面的getText, getImage等方法.
如果Model是父子结构的, 一定要覆盖getModelChildren方法.
public class TemplateTreeEditPart extends AbstractTreeEditPart {
	@Override
	protected List getModelChildren() { // 得到当前模型下的子模型.
		TemplateModel model = (TemplateModel) this.getModel();
		return model.getChildren();
		// return super.getModelChildren();
	}
}

你可能感兴趣的:(java,eclipse,UI)