`
liugang594
  • 浏览: 985868 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(译)Eclipse Zest二

    博客分类:
  • GEF
阅读更多

5. Zest和JFace的例子

5.1 创建工程

创建一个RCP应用"de.vogella.zest.jface",使用"RCP Application with a view"做为模板。增加zest的依赖项。修改Pespective.java如下:

 

 

package de.vogella.zest.jface;

import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.IPerspectiveFactory;

public class Perspective implements IPerspectiveFactory {

	public void createInitialLayout(IPageLayout layout) {
		String editorArea = layout.getEditorArea();
		layout.setEditorAreaVisible(false);
		layout.setFixed(true);
		
		layout.addView(View.ID, IPageLayout.LEFT, 1.0f, editorArea);
	}

}


 5.2 模型

创建以下模型:

 

package de.vogella.zest.jface.model;

import java.util.ArrayList;
import java.util.List;

public class MyNode {
	private final String id;
	private final String name;
	private List<MyNode> connections;

	public MyNode(String id, String name) {
		this.id = id;
		this.name = name;
		this.connections = new ArrayList<MyNode>();
	}

	public String getId() {
		return id;
	}

	public String getName() {
		return name;
	}

	public List<MyNode> getConnectedTo() {
		return connections;
	}

}

 package de.vogella.zest.jface.model;

public class MyConnection {
	final String id; 
	final String label; 
	final MyNode source;
	final MyNode destination;
	
	public MyConnection(String id, String label, MyNode source, MyNode destination) {
		this.id = id;
		this.label = label;
		this.source = source;
		this.destination = destination;
	}

	public String getLabel() {
		return label;
	}
	
	public MyNode getSource() {
		return source;
	}
	public MyNode getDestination() {
		return destination;
	}
	
}

 package de.vogella.zest.jface.model;

import java.util.ArrayList;
import java.util.List;

public class NodeModelContentProvider {
	private List<MyConnection> connections;
	private List<MyNode> nodes;

	public NodeModelContentProvider() {
		// Image here a fancy DB access
		// Now create a few nodes
		nodes = new ArrayList<MyNode>();
		MyNode node = new MyNode("1", "Hamburg");
		nodes.add(node);
		node = new MyNode("2", "Frankfurt");
		nodes.add(node);
		node = new MyNode("3", "Berlin");
		nodes.add(node);
		node = new MyNode("4", "Munich");
		nodes.add(node);
		node = new MyNode("5", "Eppelheim");
		nodes.add(node);
		node = new MyNode("6", "Ahrensboek");
		nodes.add(node);

		connections = new ArrayList<MyConnection>();
		MyConnection connect = new MyConnection("1", "1", nodes.get(0),
				nodes.get(1));
		connections.add(connect);
		connect = new MyConnection("2", "2", nodes.get(0), nodes.get(4));
		connections.add(connect);
		connect = new MyConnection("3", "3", nodes.get(2), nodes.get(1));
		connections.add(connect);
		connect = new MyConnection("4", "3", nodes.get(1), nodes.get(3));
		connections.add(connect);

		// Because we are lasy we save the info about the connections in the
		// nodes

		for (MyConnection connection : connections) {
			connection.getSource().getConnectedTo()
					.add(connection.getDestination());
		}
	}

	public List<MyNode> getNodes() {
		return nodes;
	}

}

 5.3 providers

创建以下content和label providers

 

package de.vogella.zest.jface.zestviewer;

import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.zest.core.viewers.IGraphEntityContentProvider;

import de.vogella.zest.jface.model.MyNode;

public class ZestNodeContentProvider extends ArrayContentProvider  implements IGraphEntityContentProvider {

	@Override
	public Object[] getConnectedTo(Object entity) {
		if (entity instanceof MyNode) {
			MyNode node = (MyNode) entity;
			return node.getConnectedTo().toArray();
		}
		throw new RuntimeException("Type not supported");
	}
}

 

 

 

package de.vogella.zest.jface.zestviewer;

import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.zest.core.viewers.EntityConnectionData;

import de.vogella.zest.jface.model.MyConnection;
import de.vogella.zest.jface.model.MyNode;

public class ZestLabelProvider extends LabelProvider {
	@Override
	public String getText(Object element) {
		if (element instanceof MyNode) {
			MyNode myNode = (MyNode) element;
			return myNode.getName();
		}
		// Not called with the IGraphEntityContentProvider
		if (element instanceof MyConnection) {
			MyConnection myConnection = (MyConnection) element;
			return myConnection.getLabel();
		}

		if (element instanceof EntityConnectionData) {
			EntityConnectionData test = (EntityConnectionData) element;
			return "";
		}
		throw new RuntimeException("Wrong type: "
				+ element.getClass().toString());
	}
}

 5.4 view

修改view如下:

 

package de.vogella.zest.jface;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.zest.core.viewers.AbstractZoomableViewer;
import org.eclipse.zest.core.viewers.GraphViewer;
import org.eclipse.zest.core.viewers.IZoomableWorkbenchPart;
import org.eclipse.zest.core.viewers.ZoomContributionViewItem;
import org.eclipse.zest.layouts.LayoutAlgorithm;
import org.eclipse.zest.layouts.LayoutStyles;
import org.eclipse.zest.layouts.algorithms.TreeLayoutAlgorithm;

import de.vogella.zest.jface.model.NodeModelContentProvider;
import de.vogella.zest.jface.zestviewer.ZestLabelProvider;
import de.vogella.zest.jface.zestviewer.ZestNodeContentProvider;

public class View extends ViewPart implements IZoomableWorkbenchPart {
	public static final String ID = "de.vogella.zest.jface.view";
	private GraphViewer viewer;

	public void createPartControl(Composite parent) {
		viewer = new GraphViewer(parent, SWT.BORDER);
		viewer.setContentProvider(new ZestNodeContentProvider());
		viewer.setLabelProvider(new ZestLabelProvider());
		NodeModelContentProvider model = new NodeModelContentProvider();
		viewer.setInput(model.getNodes());
		LayoutAlgorithm layout = setLayout();
		viewer.setLayoutAlgorithm(layout, true);
		viewer.applyLayout();
		fillToolBar();
	}

	private LayoutAlgorithm setLayout() {
		LayoutAlgorithm layout;
		// layout = new
		// SpringLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING);
		layout = new TreeLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING);
		// layout = new
		// GridLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING);
		// layout = new
		// HorizontalTreeLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING);
		// layout = new
		// RadialLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING);
		return layout;

	}

	/**
	 * Passing the focus request to the viewer's control.
	 */
	public void setFocus() {
	}

	private void fillToolBar() {
		ZoomContributionViewItem toolbarZoomContributionViewItem = new ZoomContributionViewItem(
				this);
		IActionBars bars = getViewSite().getActionBars();
		bars.getMenuManager().add(toolbarZoomContributionViewItem);

	}

	@Override
	public AbstractZoomableViewer getZoomableViewer() {
		return viewer;
	}
}

 最后结果如下:

 

5.5 Filter

可以通过setFilter()来定义一个filter,例如:

package de.vogella.zest.jface.zestviewer;

import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;

import de.vogella.zest.jface.model.MyNode;

public class NodeFilter extends ViewerFilter {

	@Override
	public boolean select(Viewer viewer, Object parentElement, Object element) {
		
		if (element instanceof MyNode) {
			MyNode node = (MyNode) element;
			return node.getName().toLowerCase().contains("a");
			
		}
		return true; 
	}

}

 

把这个filter用在所有元素上:

package de.vogella.zest.jface;

import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.zest.core.viewers.AbstractZoomableViewer;
import org.eclipse.zest.core.viewers.GraphViewer;
import org.eclipse.zest.core.viewers.IZoomableWorkbenchPart;
import org.eclipse.zest.core.viewers.ZoomContributionViewItem;
import org.eclipse.zest.layouts.LayoutAlgorithm;
import org.eclipse.zest.layouts.LayoutStyles;
import org.eclipse.zest.layouts.algorithms.TreeLayoutAlgorithm;

import de.vogella.zest.jface.model.NodeModelContentProvider;
import de.vogella.zest.jface.zestviewer.NodeFilter;
import de.vogella.zest.jface.zestviewer.ZestLabelProvider;
import de.vogella.zest.jface.zestviewer.ZestNodeContentProvider;

public class View extends ViewPart implements IZoomableWorkbenchPart {
	public static final String ID = "de.vogella.zest.jface.view";
	private GraphViewer viewer;

	public void createPartControl(Composite parent) {
		viewer = new GraphViewer(parent, SWT.BORDER);
		viewer.setContentProvider(new ZestNodeContentProvider());
		viewer.setLabelProvider(new ZestLabelProvider());
		NodeModelContentProvider model = new NodeModelContentProvider();
		viewer.setInput(model.getNodes());
		LayoutAlgorithm layout = setLayout();
		viewer.setLayoutAlgorithm(layout, true);
		viewer.applyLayout();
		NodeFilter filter = new NodeFilter();
		ViewerFilter[] filters = new ViewerFilter[1];
		filters[0]= filter; 
		viewer.setFilters(filters);
		fillToolBar();
	}

	private LayoutAlgorithm setLayout(){
		LayoutAlgorithm layout;
//		layout = new SpringLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING);	
		layout = new TreeLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING);
//		layout = new GridLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING);
//		layout = new HorizontalTreeLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING);
//		layout = new RadialLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING);
		return layout; 
		
	}

	/**
	 * Passing the focus request to the viewer's control.
	 */
	public void setFocus() {
	}
	
	private void fillToolBar() {
		ZoomContributionViewItem toolbarZoomContributionViewItem = new ZoomContributionViewItem(this);
		IActionBars bars = getViewSite().getActionBars();
		bars.getMenuManager().add(toolbarZoomContributionViewItem);

	}

	@Override
	public AbstractZoomableViewer getZoomableViewer() {
		return viewer;
	}
}

 

注:也可以在layout上注册filter,这样在计算布局的时候,特定的元素会被忽略。方法isObjectFiltered()。使用item.getGraphData()去得到底层的object对象。

 

6. 技巧和提示

6.1 使用结点不可移动

缺省情况下节点都可以移动,要禁用,可以如下实现:

package de.vogella.zest.movenodes.graph;

import org.eclipse.draw2d.SWTEventDispatcher;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.zest.core.widgets.Graph;

public class NonMovableGraph extends Graph {

	public NonMovableGraph(Composite parent, int style) {
		super(parent, style);
		this.getLightweightSystem().setEventDispatcher(
				new SWTEventDispatcher() {
					public void dispatchMouseMoved(
							org.eclipse.swt.events.MouseEvent me) {
						// Doing nothing
					}
				});
	}

}

 

分享到:
评论

相关推荐

    maven_eclipse_GEF-zest-3.7.1_m2e-extras_m2e.zip

    《深入理解Maven Eclipse GEF-Zest 3.7.1与m2e-extras集成》 在软件开发过程中,工具的集成与协同工作能力至关重要。Maven作为Java项目管理和构建的强大工具,大大简化了依赖管理和构建流程。而Eclipse作为广受欢迎...

    maven与eclipse集成所需插件

    **二、Eclipse的介绍** Eclipse作为一个开放源代码的IDE,拥有丰富的插件生态系统,支持多种语言的开发。它提供了代码编辑、调试、版本控制等多种功能,极大地提高了开发效率。 **三、Maven与Eclipse的集成** 1. **...

    m2eclipse插件

    2. `org.eclipse.zest.layouts_1.1.0.v20110425-2050.jar`:这个文件包含了Zest布局算法,用于自动布局Zest图中的节点和边,使得图形更加清晰易读。在m2eclipse的环境中,它可能帮助用户更好地理解项目的结构和依赖...

    Eclipse Indigo 离线安装maven插件m2eclipse

    旧版本eclipse,比如indigo版本要安装maven,旧的在线安装方式已经失效,因为依赖的zest和m2eclipse的location url都已经无法访问。所以从已经安装这两个包的eclipse中分离出离线的安装包,拷贝到对应的features和...

    maven插件安装以及eclipse安装maven插件的资料

    2. 在搜索框中输入`maven`,查找Maven相关插件,最常见的是Maven Integration for Eclipse(M2E)。 3. 安装M2E:找到插件后,点击`Install`,遵循向导完成安装并重启Eclipse。 4. 配置M2E:进入`Window` -&gt; `...

    eclipse常用插件安装

    2. **m2eclipse**:这是Maven集成到Eclipse的插件,它提供了对Maven构建工具的支持,包括项目配置、依赖管理和生命周期集成。m2eclipse可以从http://m2eclipse.sonatype.org/sites/m2e获取。 3. **iBATIS Abator**...

    org.eclipse.gef

    9. **Zest 图形库**:作为 GEF 的一部分,Zest 是一个专门用于构建图形图表的库,适用于生成流程图、关系图和其他类型的可视化信息。 综上所述,"org.eclipse.gef" 插件为 Eclipse 开发者提供了一套强大的工具,...

    Eclipse插件开发:GEF入门系列宝典

    Eclipse插件开发是软件开发领域中的一个重要环节,它允许开发者扩展Eclipse集成开发环境(IDE)的功能,以满足特定的开发需求。GEF(Graphical Editing Framework)是Eclipse平台的一部分,专为构建图形化编辑器而...

    eclipse的GEF插件

    Eclipse的GEF(Graphical Editing Framework)插件是一个强大的工具,用于在Eclipse集成开发环境中创建、编辑和展示图形用户界面。它为开发者提供了一种框架,支持创建可定制的、交互式的图形编辑器,使得开发人员...

    eclipse_gef_example.rar

    2. **org.eclipse.gef.examples.shapes** 形状示例展示了如何创建和操作各种图形形状,如矩形、椭圆、线条等。这部分包含了创建自定义图形模型、绘制和布局形状的方法,以及如何实现拖放、缩放、旋转等交互功能。这...

    eclipse插件 GEF-SDK-3.4.0.zip

    - **Zest图表库**:GEF的一部分,用于创建复杂的图表和图形网络,如流程图、关系图等。 5. **插件安装与集成** 将"GEF-SDK-3.4.0.zip"解压后,开发者可以通过Eclipse的"Install New Software"功能将插件导入到...

    eclipse gef 插件 最新版本

    - **Zest图库**:作为GEF的一部分,Zest提供了用于创建图表的强大库,如树图、网络图等。 - **Marlin 3D绘图**:对于需要三维视图的项目,Marlin是GEF的一个扩展,提供3D图形支持。 总之,Eclipse GEF插件通过其...

    eclipse及gef相关文档

    2. **PDE工具**:介绍如何使用Eclipse内置的PDE工具来开发、调试和打包插件。 3. **插件生命周期**:解释插件的启动、运行和停止过程,以及如何响应Eclipse事件。 4. **扩展点和扩展**:介绍如何定义和使用Eclipse的...

    Eclipse插件开发--gef开发指南与入门系列宝典

    同时,熟悉GEF也能为你打开通往其他图形工具如GMF(Graphical Modeling Framework)和Zest(图可视化库)的大门。 总的来说,Eclipse插件开发结合GEF框架是一项强大且富有挑战性的技术。随着你对这个领域的深入探索...

    Eclipse GEF Reference(Plugins&Examples;,with source)

    2. **Draw2D**: Draw2D是GEF的基础,它是一个二维图形绘制库,用于在Eclipse RCP应用程序中创建和管理图形元素。Draw2D提供了各种图形形状、布局算法和交互功能。 3. **ZEST**:ZEST(Zest Graph Visualization)...

    The Eclipse Graphical Editing FrameWork

    GEF还提供了Zest组件,它是GEF的一个子项目,专注于开发图形可视化工具,比如图形化的图表和网络。 开发GEF插件时,开发者需要编写相应的Model、EditPart和EditPolicy类,并将它们关联起来,以构建完整的图形编辑...

    ECLIPSE GEF 5.4.0

    5. **Zest图渲染库**:ECLIPSE GEF 5.4.0可能集成了Zest库,这是一个用于绘制图表和图形网络的库,可以创建有吸引力的视觉表示。 6. **插件体系**:Eclipse本身就是一个插件化的开发环境,GEF也是通过插件形式集成...

    GEF-zest-3.6.1.zip

    GEF-zest-3.6.1.zipGEF-zest-3.6.1.zipGEF-zest-3.6.1.zipGEF-zest-3.6.1.zipGEF-zest-3.6.1.zipGEF-zest-3.6.1.zip

    GEF的Eclipse官方示例(源代码)

    你可以看到如何使用`Zest`库创建图表,以及如何实现基本的交互,如拖放、连接线等。 2. **高级示例**:高级示例可能包含更多的特性,如自定义手势识别、复杂编辑操作(如剪切、复制、粘贴)、以及使用`...

    zest-creator:用于创建有效的 zest 脚本并与脚本交互的节点包

    Zest Creator 工具,用于创建有效的 zest 脚本并通过辅助方法与脚本交互。 使用 安装它: ```bash $ npm i zest-creator ``` 需要它并使用: ```js var ZestCreator = require('zest-creator'); var opts = { ...

Global site tag (gtag.js) - Google Analytics