- 浏览: 990797 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
运乃强谦:
老哥,你确定这个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 1370第一步 增加Palette项: moveTool = n ... -
Draw2d的ScrollPane的使用
2011-04-19 15:05 1611ScrollPane scrollpane = ne ... -
GEF的动态变化二
2011-04-13 10:47 1365之前有一篇文件介绍怎么实现GEF Editor中的图元的渐近、 ... -
(译)Eclipse Zest二
2011-01-07 15:41 19905. Zest和JFace的例子 5.1 创建工程 创建一 ... -
(译)Eclipse Zest一
2011-01-07 15:14 29191. Eclipse Zest 1.1 概述 Eclips ... -
增加GEF的动态性
2011-01-06 10:25 1785在一个GEF应用中,最常的操作是移位和缩放。移位和缩放实现本身 ... -
定制GEF的Palette
2009-11-23 16:35 2546用GEF框架实现一个Editor时,会有一个默认的palett ... -
GEF增加之连接助手二
2009-10-29 16:01 1054上一篇说过怎么实现悬浮连接助手。一直想要怎么实现悬浮连接助手。 ... -
GEF功能增强之创建助手
2009-09-28 09:09 1716用过GMF就知道,GMF默认生成的editor有一个悬浮的创建 ... -
GEF功能增强之连接助手
2009-09-10 14:45 1808GEF图形编辑器中,通常 ... -
GEF中实现“拷贝为图片”
2009-09-06 09:13 1368在一个GEF的编辑器中,编辑器上是一个个的Figure,从外观 ... -
GEF中扩大、缩小时处理编辑行为
2008-12-30 10:54 1536我们为GEF应用提供了ZoomIn和ZoomOut功能之后,在 ... -
改变GEF的一些默认行为
2008-12-29 14:12 1428一、改变Layer GEF中会根据editpart的类 ... -
GEF中一个模型的多层图的问题
2008-12-26 16:00 1651一般来说,我们在做GEF的时候,通常是一个模型对应一个图,这个 ... -
GEF中增加ContextMenu的支持
2008-12-19 22:32 2642GEF中,增加对EditPart的右键菜单的支持是很普遍的一 ... -
增加Palette的拖放支持
2008-12-19 14:08 1967默认情况下,GEF中要创建一个新的结点都是通点在Palette ... -
给GEF拖放功能
2008-07-17 10:26 1898我们知道SWT支持Native的拖放。GEF使用SWT的拖放来 ... -
修改GEF中Connection的端点
2008-07-14 16:09 1846GEF中,选中一条连接线,默认的端点是两个小黑框,如下: ... -
GEF中导视图的使用
2008-07-10 17:01 2197有时增加一个导视图能给用户很大的方便性,例如在outline视 ... -
(接上篇)关于GEF Feedback的补充
2008-07-10 10:18 1406重复上篇,我们有以下类: 1、模型相关:RouteMap、H ...
相关推荐
在GEF(Graphical Editing Framework)中,属性视图(Property View)的实现是一个关键功能,它允许用户查看和编辑图形模型的属性。属性视图是数据源与用户界面之间的桥梁,确保图形模型和属性视图之间保持同步更新...
GEF提供了`PropertySheet`来展示属性,并且可以自定义属性页,以便根据模型类的不同属性显示不同的编辑控件。 **十二、拖放(Drag and Drop)** GEF支持拖放操作,用户可以将图形元素从一个位置拖动到另一个位置,...
用视图显示在GEF编辑器编辑好的图形 在视图里加入GraphicalViewer viewer = new ScrollingGraphicalViewer(); viewer.createControl(parent);
这个项目旨在演示如何利用GEF进行图形界面开发,并且特别关注了通过适配器(Adapter)扩展点来实现属性页配置以及在非Editor的ViewPart中使用GEF。 GEF是Eclipse平台下的一个开源库,专门用于构建可自定义的、图形...
GEF 入门学习资料,简单地介绍了 GEF 使用过程中用到的基本类和函数的用法。 GEF(Graphical Editor Framework)是一种图形化编辑框架,能够提供图形化编辑模型的功能,提高用户体验。典型的应用包括图形化的流程...
在本教程中,我们将深入探讨GEF的基本概念、设计原则以及如何使用它来开发自己的图形编辑器。 **1. GEF简介** GEF的设计目标是将图形编辑器的实现细节抽象化,让开发者能够专注于业务逻辑和模型设计,而不是底层的...
2. **属性栏**: 属性栏用于显示和编辑选定图形元素的属性。这可以通过实现`PropertySheetPage`和`IPropertySource`接口来完成,将模型的属性映射到可编辑的表单控件。 3. **图形绘制**: GEF提供了一系列类来支持...
文档中指出,创建一个Editor是为了在图形界面中显示GEF图形,而这一部分通常是在Eclipse的EditorPart基础上扩展来的。作者还提到了模型、控制器和视图的放置位置,强调了Editor类应该放在gef.tutorial.step.ui包中,...
在本篇文章中,我们将深入探讨gef转折线的相关方法实现以及GEF的API。 首先,让我们理解一下什么是转折线。在图形编辑中,转折线通常指的是具有多个折点的线条,这些折点可以由用户交互式地调整,以改变线条的形状...
Gef布局显示学习是针对Linux系统调试工具Gef(GDB Enhanced Features)的一种深入探究,它主要涉及如何在GDB(GNU Debugger)中有效地利用Gef的各种功能来优化代码调试过程。Gef是一款强大的GDB插件,提供了丰富的...
在GEF中,模型通常由EMF(Eclipse Modeling Framework)来定义和管理,可以将业务逻辑和视图分离。 2. **视图(View)**:视图是模型的可视化表示,它将模型数据呈现为用户界面。GEF提供了基础框架来实现这一转换,...
**GEF(Graphical Editing Framework)** 是一个用于构建图形化编辑器的...对于希望在Java和Eclipse环境中提升图形界面开发技能的程序员来说,"GEF入门必读 GEF入门系列 GEF-whole-upload"是一个不可多得的学习资源。
标题中的“GEF资源打包”指的是一个集合了关于GEF(Graph Edit Framework)的各种学习资料的压缩文件。这个资源包可能包含了对理解、学习和使用GEF非常有帮助的材料。描述进一步说明了这个包中包含的具体内容,如...
GEF的开发指南详细讲解了如何使用该框架进行图形编辑,内容涵盖了从创建RCP(Rich Client Platform)插件开始,到创建图形编辑器、与图形的交互、撤销/回复操作、缩放、快捷键设置、大纲视图、鸟瞰视图、环境菜单、...
GEF(Graphical Editing Framework)是Eclipse平台中的一个核心组件,主要用于构建图形化编辑工具。这个实例代码2是《Eclipse插件开发》教程中的一部分,旨在帮助初学者理解如何利用GEF来创建自定义的图形编辑器。在...
在图形编辑框架(GEF,Graphical Editing Framework)中,锚点(Anchor)是一个关键概念,它是连接模型元素之间的连接线在元素上的固定点。在GEF中,锚点的定位直接影响到连接线的形状和行为,特别是当用户通过鼠标...
《Eclipse开发使用GEF和EMF》是IBM红皮书系列中的一部经典著作,主要探讨了如何在Eclipse环境中利用GEF(图形编辑框架)和EMF( Eclipse模型框架)进行图形化应用程序的开发。这两项技术是Eclipse平台上的核心组件,...
Eclipse的GEF(Graphical Editing Framework)插件是一个强大的工具,用于在Eclipse集成开发环境中创建、编辑和展示图形用户界面。它为开发者提供了一种框架,支持创建可定制的、交互式的图形编辑器,使得开发人员...
通过系统的学习和实践,尤其是参考“八进制”Blog上的详尽教程,开发者能够逐渐掌握GEF框架的精髓,从而在实际项目中发挥其最大效能,创造出既美观又实用的图形编辑应用。GEF框架的学习之路虽漫长,但其带来的回报...
在互联网上以及相关书籍(如IBM Redbook)中找到的主要文档更多地集中在GEF的理论概念上,而非具体如何使用GEF类的实际应用案例。因此,本教程旨在通过实际操作指导读者逐步掌握GEF的核心技术和实践技巧。 #### 二...