- 浏览: 978339 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
运乃强谦:
老哥,你确定这个wsdl 地址 可以访问?
[CXF] Server与Client实现方式五:HTTPS -
wangyudong:
由CXF实现的微服务需要有比较好的工具去测试RESTful A ...
[CXF] Server与Client实现方式四:JMS -
dengmiao:
JAXB学习三 (验证) -
panamera:
你好。可以提供maven pom配置是怎么配置的?不知道你使用 ...
[CXF] Server与Client实现方式四:JMS -
u010221220:
请问楼主一二三部分的代码都应该放在哪个函数体中。
使用JDI监听Java程序运行
一般来说我们只需要在GraphicalViewer部分显示在Property页即可。
要支持GraphicalViewer和PaletteViewer都能对属性页有支持,就有点复杂。
每个Site只能有一个SelectionProvider,正是这个SelectionProvider里选中的对象才有可能显示在属性页。在GEF中,情况下,GraphicalViewer被设置为这个EditorSite的SelectionProvider。因为只能有一个SelectionProvider,因此我们不能同时设置PaletteViewer为SelectionProvider。
所以,首先我们就需要自定义一个SelectionProvider,它聚合这两部分的Provider,并且在这两者之间切换,如下:
public class CustomSelectionProvider implements ISelectionProvider, FocusListener { private GraphicalViewer graphicalViewer; private PaletteViewer paletteViewer; private Widget focusControl; public CustomSelectionProvider(GraphicalViewer graphicalViewer, PaletteViewer paletteViewer) { super(); this.graphicalViewer = graphicalViewer; this.paletteViewer = paletteViewer; this.graphicalViewer.getControl().addFocusListener(this); this.paletteViewer.getControl().addFocusListener(this); } public void addSelectionChangedListener(ISelectionChangedListener listener) { graphicalViewer.addSelectionChangedListener(listener); paletteViewer.addSelectionChangedListener(listener); } public ISelection getSelection() { if (focusControl == graphicalViewer.getControl()) return graphicalViewer.getSelection(); else if (focusControl == paletteViewer.getControl()) { return paletteViewer.getSelection(); } return null; } public void removeSelectionChangedListener( ISelectionChangedListener listener) { graphicalViewer.removeSelectionChangedListener(listener); paletteViewer.removeSelectionChangedListener(listener); } public void setSelection(ISelection selection) { if (focusControl == graphicalViewer.getControl()) graphicalViewer.setSelection(selection); else if (focusControl == paletteViewer.getControl()) paletteViewer.setSelection(selection); } public void focusGained(FocusEvent e) { focusControl = e.widget; if (paletteViewer.getControl() == focusControl) { ISelection selection = paletteViewer.getSelection(); setSelection(null); setSelection(selection); } else if (graphicalViewer.getControl() == focusControl) { ISelection selection = graphicalViewer.getSelection(); setSelection(null); setSelection(selection); } } public void focusLost(FocusEvent e) { } }
有了这个自定义的SelectionProvider,我们就可以用它来替换Editor中缺省的GraphicalViewer,重写Editor的createPartControl()方法:
@Override public void createPartControl(Composite parent) { super.createPartControl(parent); PaletteViewer paletteViewer = ((CustomPaletteViewerProvider) getPaletteViewerProvider()) .getPaletteViewer(); CustomSelectionProvider selectionProvider = new CustomSelectionProvider( getGraphicalViewer(), paletteViewer); getSite().setSelectionProvider(selectionProvider); }
这里的CustomPaletteViewerProvider也是一个自定义的PaletterViewerProvider,因为缺省的PaletterViewerProvider没有提供方法返回对象的PaletteViewer。自定义一个也很简单,增加一个返回PaletteViewer的方法即可:
public class CustomPaletteViewerProvider extends PaletteViewerProvider { private PaletteViewer paletteViewer; public CustomPaletteViewerProvider(EditDomain graphicalViewerDomain) { super(graphicalViewerDomain); } @Override public PaletteViewer createPaletteViewer(Composite parent) { paletteViewer = super.createPaletteViewer(parent); return paletteViewer; } public PaletteViewer getPaletteViewer() { return paletteViewer; } }
然后用这个PaletteViewerProvider替换缺省的,重写Editor中的方法:
@Override protected PaletteViewerProvider createPaletteViewerProvider() { return new CustomPaletteViewerProvider(getEditDomain()); }
这样,一个可以左右切换的SelectionProvider就准备好了,它可以同时支持Palette和Graphical两个部分。
最后一个步骤就是怎么让Property View感知他们。每次一个Site上的SelectionProvider选项发生变动的时候,Property View都会被通知,去检查当前选中对象是否支持在Property页上显示。一个能够在Property页上显示的对象有两种实现方式:
1.对象实现IPropertySource接口
2.对象实现IAdaptable接口,在方法getAdater(Class)里,实现IPropertySource.class的支持。
如果用第一种方法,那显示我们需要重写所有的Palette部分,那比较复杂。因此我们选择第二种方法。
对于第二种方式,如果在每种节点类型的getAdapter(Class)方法里追加IPropertySource的实现,那最终结果和使用方法一一样,得把整个Palette都重写一次。
对于方法2,我们还有第二个选项,扩展“org.eclipse.core.runtime.adapters”扩展点。
所有的Palette上的对象,也都是一个AbstractEditPart,这个对象的getAdapter(Class)的实现是:如果没有找着匹配的实现,则最后会查找Eclipse里所有已经注册的adapter对。例如:
public Object getAdapter(Class key) { if (AccessibleEditPart.class == key) return getAccessibleEditPart(); return Platform.getAdapterManager().getAdapter(this, key); }
因此我们可以通过扩展“org.eclipse.core.runtime.adapters”扩展点来达到目的,可以如下扩展:
<extension point="org.eclipse.core.runtime.adapters"> <factory adaptableType="org.eclipse.gef.ui.palette.editparts.PaletteEditPart" class="。。。.PaletteAdapterFactory"> <adapter type="org.eclipse.ui.views.properties.IPropertySourceProvider"> </adapter> </factory> </extension>
其中adaptableType表示对哪种类型的结点应用,adapter里的type表示这个adapter应该返回一个什么类型的对象,class就是具体的实现类。例如一个简单的实现如下:
public class PaletteAdapterFactory implements IAdapterFactory { public Object getAdapter(Object adaptableObject, Class adapterType) { return new CustomPropertySourceProvider( (PaletteEditPart) adaptableObject); } public Class<PaletteEditPart>[] getAdapterList() { return new Class[] { PaletteEditPart.class }; } } class CustomPropertySourceProvider implements IPropertySourceProvider { private PaletteEditPart editPart; public CustomPropertySourceProvider(PaletteEditPart editPart) { this.editPart = editPart; } public IPropertySource getPropertySource(Object object) { return new CustomPropertySource(editPart); } } class CustomPropertySource implements IPropertySource { private PaletteEditPart editPart; public CustomPropertySource(PaletteEditPart editPart) { this.editPart = editPart; } public Object getEditableValue() { return null; } public IPropertyDescriptor[] getPropertyDescriptors() { IPropertyDescriptor[] descriptors = new IPropertyDescriptor[1]; descriptors[0] = new TextPropertyDescriptor("TEXT", "ToString"); return descriptors; } public Object getPropertyValue(Object id) { return editPart.toString(); } public boolean isPropertySet(Object id) { return true; } public void resetPropertyValue(Object id) { } public void setPropertyValue(Object id, Object value) { } }
这个实现的效果就是,每次选中Palette中的一个结点,则把它的toString()结果显示在Property上。
发表评论
-
GEF中用鼠标移动画布
2011-12-27 13:37 1320第一步 增加Palette项: moveTool = n ... -
Draw2d的ScrollPane的使用
2011-04-19 15:05 1585ScrollPane scrollpane = ne ... -
GEF的动态变化二
2011-04-13 10:47 1292之前有一篇文件介绍怎么实现GEF Editor中的图元的渐近、 ... -
(译)Eclipse Zest二
2011-01-07 15:41 19045. Zest和JFace的例子 5.1 创建工程 创建一 ... -
(译)Eclipse Zest一
2011-01-07 15:14 28331. Eclipse Zest 1.1 概述 Eclips ... -
增加GEF的动态性
2011-01-06 10:25 1743在一个GEF应用中,最常的操作是移位和缩放。移位和缩放实现本身 ... -
定制GEF的Palette
2009-11-23 16:35 2497用GEF框架实现一个Editor时,会有一个默认的palett ... -
GEF增加之连接助手二
2009-10-29 16:01 1000上一篇说过怎么实现悬浮连接助手。一直想要怎么实现悬浮连接助手。 ... -
GEF功能增强之创建助手
2009-09-28 09:09 1672用过GMF就知道,GMF默认生成的editor有一个悬浮的创建 ... -
GEF功能增强之连接助手
2009-09-10 14:45 1772GEF图形编辑器中,通常 ... -
GEF中实现“拷贝为图片”
2009-09-06 09:13 1317在一个GEF的编辑器中,编辑器上是一个个的Figure,从外观 ... -
GEF中扩大、缩小时处理编辑行为
2008-12-30 10:54 1494我们为GEF应用提供了ZoomIn和ZoomOut功能之后,在 ... -
改变GEF的一些默认行为
2008-12-29 14:12 1387一、改变Layer GEF中会根据editpart的类 ... -
GEF中一个模型的多层图的问题
2008-12-26 16:00 1610一般来说,我们在做GEF的时候,通常是一个模型对应一个图,这个 ... -
GEF中增加ContextMenu的支持
2008-12-19 22:32 2604GEF中,增加对EditPart的右键菜单的支持是很普遍的一 ... -
增加Palette的拖放支持
2008-12-19 14:08 1931默认情况下,GEF中要创建一个新的结点都是通点在Palette ... -
给GEF拖放功能
2008-07-17 10:26 1859我们知道SWT支持Native的拖放。GEF使用SWT的拖放来 ... -
修改GEF中Connection的端点
2008-07-14 16:09 1789GEF中,选中一条连接线,默认的端点是两个小黑框,如下: ... -
GEF中导视图的使用
2008-07-10 17:01 2144有时增加一个导视图能给用户很大的方便性,例如在outline视 ... -
(接上篇)关于GEF Feedback的补充
2008-07-10 10:18 1374重复上篇,我们有以下类: 1、模型相关:RouteMap、H ...
相关推荐
在GEF中property view 页面的实现!介绍了其实现的步骤方法!还结合了实例进行讲解!
用视图显示在GEF编辑器编辑好的图形 在视图里加入GraphicalViewer viewer = new ScrollingGraphicalViewer(); viewer.createControl(parent);
dudu翻译的GEF中文教程,入门最佳资料。附每章代码。
gef布局显示学习
GEF_Demo_Code20170307,用adapter扩展点实现属性页配置;在ViewPart中(不是editor)使用GEF框架;
这是我自己在学习GEF的时候做的一些总结。 1、GEF中的概念比如Command,Tool,Request等等。 2、GEF中使用到的几种设计模式。 3、GEF中对鼠标键盘事件处理的机制、流程。
GEF入门必读 GEF入门系列 GEF-whole-upload 感谢八进制
GEF入门实例代码2《Eclipse插件开发》中实例
这是我参考了一些其他资料,自己写的一个GEF示例...1. 在你的Eclipse中要有GEF, Draw2d的包 2. 将此压缩包中的eclipse project引入到你的Eclipse环境中 3. 运行这个插件 4. 看到界面后,点击 Tools -- Open GEF Editor
RCP GEF 入门教程,从法语班翻译过来的,自认为是比较全面细致的GEF入门教程,配套源码,很有学习价值!!!
我下的资源的打包,希望有帮助,包括:GEF_Tutorial,GEF实例,入门教程,GEF-whole-upload
GEF简易教程-学习GEF的入门教程,不错的gef入门教程
GEF eclipse 插件
RCP与GEF的课件,简单的介绍了RCP和GEF中的各组件的功能,已经工作流程
gef 绘图折线的实现方法。 gef API chm 格式
eclipse3.4的可视化开发GEF eclipse3.4的可视化开发GEF eclipse3.4的可视化开发GEF
学习GEF的入门资料,简单地介绍了GEF使用过程中用到的基本类和函数的用法。
GEF: Graphical Editing Framework <br>GEF是一套MVC Framework,它能帮你比较容易的建立图形化的编辑器,V(View)的部分常常是基于SWT的Draw2D,因此Draw2D也看作是GEF的一部分。依赖:org.eclipse.gef***, org...
GEF入门系列,八进制 的GEF入门系列教程, 由社区经作者授权后整理而成GEF(Graphical Editor Framework)是一个图形化编辑框架,它允许开发人员以图形化的方式展示和编辑模型,从而提升用户体验。这样的应用程序有很...
GEF.rar GEF.rar GEF.rar