- 浏览: 2474267 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (574)
- Book (62)
- Architecture (6)
- Java (39)
- Taobao (41)
- Distributed (4)
- Life (72)
- Database (7)
- Spring (16)
- Photography (15)
- Bicycle (41)
- Test (20)
- jBPM (8)
- Business (12)
- Movie (3)
- Ajax (15)
- Code (7)
- Eclipse (96)
- VIM (2)
- Music (6)
- Groovy (10)
- AutoHotKey (3)
- Dorado (10)
- Maven (7)
- Scrum (5)
- English (20)
- Financial (12)
- OSGi (3)
- Other (4)
- Tool (6)
- Browser (1)
- PPT (1)
- Project Management (4)
- Agile (6)
- Nosql (1)
- Search engine (6)
- Shell (2)
- Open Source (4)
- Storm (10)
- Guava (3)
- Baby (1)
- netty (1)
- Algorithm (1)
- Linux (1)
- Python (2)
最新评论
-
roy2011a:
https://github.com/ebottabi/sto ...
storm的序列化问题及与spring的结合方式 -
roy2011a:
能抗能打 写道哥们儿,你好!能共享下那个storm与sprin ...
storm的序列化问题及与spring的结合方式 -
Alick1:
兄弟,你之前是不是在深圳的正阳公司呆过啊?
storm的ack和fail -
liuleixwd:
先点个赞,写的非常好!有个问题请教下,如果我再bolt里不用e ...
storm的ack和fail -
yao-dd:
solr的facet查询
FROM:http://www.cnblogs.com/bjzhanghao/archive/2005/12/23/303508.html
第三篇帖子介绍了定制一个EMF应用程序的基本方法,这一篇让我们来看看怎样定制应用程序的使用界面。没有任何一个界面是万能的,所以定制工作不可避免,而大多数定制都是通过修改代码来实现的。在实际应用中,同一个需求可能有多种修改方式可以实现,我认为修改涉及的地方(类,方法)越少越有利于发挥EMF的优势,因此我们应该对EMF生成的代码有一定的了解,这是发挥自己创造力的基础。
下面有几个常见的需求,通过对这些需求的实现,相信你会对EMF应用程序的开发过程有一个更具体的认识。
一、简化模型创建向导
EMF帮我们生成的模型创建向导(菜单File->New->Other->Shop Model)分为两步,第一步要用户输入文件名,对于商店的例子文件名是*.shop格式;第二步用户要选择以哪个对象作为根节点,同时要指定XML文件的编码方式,商店例子里显然要以商店对象为根节点,所以其实第二步可以省去,以免造成使用者的困扰。
生成的向导类是ShopModelWizard,比起增加一个步骤来,去掉一个步骤要简单得多。首先找到addPages()方法,把最后四句关于initialObjectCreationPage最的语句都注释掉;
- /**
- * The framework calls this to create the contents of the wizard.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated NOT
- */
- public void addPages() {
- //initialObjectCreationPage = new ShopModelWizardInitialObjectCreationPage("Whatever2");
- //initialObjectCreationPage.setTitle(ShopEditorPlugin.INSTANCE.getString("_UI_ShopModelWizard_label"));
- //initialObjectCreationPage.setDescription(ShopEditorPlugin.INSTANCE.getString("_UI_Wizard_initial_object_description"));
- //addPage(initialObjectCreationPage);
- }
现在因为没有了这个向导页,原来由它提供的信息我们要改为在程序里提供,所以要修改另外两个方法:第一,createInitialModel()方法本来是建立一个用户选择的对象作为根节点的模型,我们把它改为直接建立一个Shop对象;
- protected EObject createInitialModel() {
- // EClass eClass = (EClass)shopPackage.getEClassifier(initialObjectCreationPage.getInitialObjectName());
- // EObject rootObject = shopFactory.create(eClass);
- EObject rootObject=shopFactory.createShop();
- return rootObject;
- }
第二,在performFinish()方法里设置文件编码的地方,改为使用UTF-8编码,当然你也可以规定使用其他编码,只是用户不能选择了:
- public boolean performFinish() {
- options.put(XMLResource.OPTION_ENCODING, "UTF-8"/*initialObjectCreationPage.getEncoding()*/);
- }
因此,这个类里我们总共修改了三个方法,一定记得要把每个方法前的@generated标记删除或修改。现在,用户只要简单的指定文件名后就可以Finish了,如图1所示。
图1 向导的最后一页
二、改造大纲视图的显示
对于EMF来说,在应用程序模型的根节点上还有两层,分别是Resource和ResourceSet,在商店的例子里,Category的父节点是Shop,Shop的父节点是Resource(具体来说是XMLResource),Resource的父节点是ResourceSet,它们之间都是多对一的关系。缺省情况下,大纲视图里显示的是完整的ResourceSet树(根节点不显示),显示出的最上层节点是“platform: /resource/Project3/My.shop”,它代表一个Resource,这个Resource(通过这个URI)指向保存着模型信息的 XML文件My.shop。对于使用者来说,这个节点显示在这里没有什么意义,用户看到的根节点应该是.shop文件里保存的Shop对象,见图2的对比。
图2 在大纲视图里隐藏最上层节点
那么该修改哪些代码来实现这个需求呢?我们想到大纲视图里的内容是从ShopEditor的getAdapter()方法里得到的,通过查看 ShopEditor的getAdapter()方法发现名为getContentOutlinePage()的方法负责产生大纲模型,在这个方法里,变量contentOutlineViewer是对大纲视图里的树控件的包装对象,它的输入(Input)是 editingDomain.getResourceSet(),我们要把它的输入改成ResourceSet的第一个Resource,修改后的代码如下:
- public IContentOutlinePage getContentOutlinePage() {
- //contentOutlineViewer.setInput(editingDomain.getResourceSet());
- contentOutlineViewer.setInput(editingDomain.getResourceSet().getResources().get(0));
- }
你可能会问,那么从Resource怎样得到Shop对象呢?很简单,(Shop)yourResource.getContents().get (0)即可,有兴趣的话你可以试试把大纲视图的输入设为Shop对象会看到什么。最后说一次不要忘记修改@generated,以后不再提醒了。
三、移除编辑器里多余的Tab页
EMF生成的Editor为我们提供了六个Tab页,其主要目的是向我们演示如何以各种方式展示数据(例如在大纲视图里选择一个Category对象,通过Parent页里可以很容易的看到前面说过的Category->Shop->Resource->ResourceSet关系),在实际的应用里一般不会用到全部这些页,下面我们就只保留Table页而移除其他五页,利用大纲和Table页的组合,实现类似Windows资源管理器的界面。
编辑器里的页面在createPages()方法里被添加,它虽然很长但EMF在这个方法里生成了不少注释,每段代码的作用都很明显,只要把我们不需要的那五段注释掉即可。现在把程序运行起来,打开一个模型文件,稍微调整一下布局把大纲视图放在编辑器的旁边,如图3所示,有点资源管理器的样子了吧。
图3 和资源管理器类似的布局
但是很遗憾,现在的表格里只有两列,而且两列里显示的内容是相同的。按照资源管理器的设计,当用户在大纲视图里选择一个对象时,表格中应该显示该对象的子对象详细信息的列表,现在子对象列表已经有了(表格里每一行就是一个子对象),让我们做一些修改以显示详细信息。
首先增加一个表格列,还是在ShopEditor的createPages()方法里修改,搜索一下TableColumn很容易找到应该修改的位置。新的三列标题分别为“Name”、“Children”和“Description”,其中Children列里显示子对象的数目。
- public void createPages() {
- TableColumn objectColumn = new TableColumn(table, SWT.NONE);
- layout.addColumnData(new ColumnWeightData(3, 100, true));
- objectColumn.setText("Name");
- objectColumn.setResizable(true);
- TableColumn childrenColumn = new TableColumn(table, SWT.NONE);
- layout.addColumnData(new ColumnWeightData(2, 100, true));
- childrenColumn.setText("Children");
- childrenColumn.setResizable(true);
- TableColumn descColumn = new TableColumn(table, SWT.NONE);
- layout.addColumnData(new ColumnWeightData(2, 100, true));
- descColumn.setText("Description");
- descColumn.setResizable(true);
- }
如果现在运行程序,看到的将是三列,但内容仍然是相同的。表格里显示的内容是由生成的XXXItemProvider类决定的,例如对于一个 Category对象在表格或树控件里怎样展示是由CategoryItemProvider来负责,你可以把它看作是JFace里的 ContentProvider加上LabelProvider,这些XXXItemProvider都被放在.edit项目里了。EMF生成的 CategoryItemProvider没有实现ITableItemLabelProvider接口,所以缺省情况下不能支持表格的展示(能够显示,但每列的内容相同),所以我们要对代码进行一些修改,在CategoryItemProvider实现的接口列表里增加 ITableItemLabelProvider,并实现它的两个方法,修改后的代码如下:
- public class CategoryItemProvider
- extends ItemProviderAdapter
- implements
- IEditingDomainItemProvider,
- IStructuredItemContentProvider,
- ITreeItemContentProvider,
- IItemLabelProvider,
- IItemPropertySource,
- ITableItemLabelProvider{
- public Object getColumnImage(Object object, int columnIndex) {
- return null;
- }
- public String getColumnText(Object object, int columnIndex) {
- Category category=(Category)object;
- switch (columnIndex) {
- case 0:
- return category.getName();
- case 1:
- return category.getChildren().size()+"";
- case 2:
- return "";//Categories don't own descriptions
- default:
- return "";
- }
- }
- }
现在只差一步就完成了,如果你注意看过ShopEditor的createPages()方法里定义TableViewer的代码,会发现这个 TableViewer的ContentProvider和LabelProvider都是一个 AdapterFactoryContentProvider对象,这个对象会把TableViewer对getText()、getElements ()的请求转发到XXXItemProvider上;转发之前它要得到这个XXXItemProvider,这是通过 ShopItemProviderAdapterFactory的adapt()方法实现的,而 ShopItemProviderAdapterFactory维护了一个supportTypes列表,只有注册到这个列表中的类型才能被adapt。这里出现了不少新内容,可能不那么容易理解,没有关系,因为在以后的帖子里会专门介绍到它们,现在只要记住需要把我们新实现的接口类型注册到 ShopItemProviderAdapterFactory的supportTypes里即可,具体的方法是修改它的构造方法,如下所示:
- public ShopItemProviderAdapterFactory() {
- supportedTypes.add(IEditingDomainItemProvider.class);
- supportedTypes.add(IStructuredItemContentProvider.class);
- supportedTypes.add(ITreeItemContentProvider.class);
- supportedTypes.add(IItemLabelProvider.class);
- supportedTypes.add(IItemPropertySource.class);
- supportedTypes.add(ITableItemLabelProvider.class);//Added to support table
- }
现在,表格里显示的Category对象已经按我们的要求列出其他信息了,如图4所示,Description列是空白因为Category没有这个属性。我们还应该修改ProductItemProvider以展示产品的详细信息,方法和修改Category是类似的,而且增加 supportTypes的步骤不须要重复做,所以更加简单了,不妨就留作练习。
图4 经过定制的表格
经过上面的这些定制,我们就实现了应用程序从EMF缺省界面到资源管理器风格界面的转换,虽然文字比较多,但掌握以后这个过程是相当快速的,而且其他的定制也是同样的思路。点此下载代码。
发表评论
-
Java程序员25个必备的Eclipse插件
2012-01-12 22:36 21936原文:http://www.fromdev.com/2012/ ... -
关于插件更新安装的错误
2007-12-21 20:12 2217在更新插件的时候出现这样的错误: Unable to comp ... -
最近做eclipse branding, features的一些经验
2007-12-16 01:24 4552知道eclipse的splash怎么做 ... -
GEF学习笔记
2007-12-07 20:20 4164GEF以前学习过, 而且还 ... -
SWT布局深入学习
2007-11-30 23:00 7947以下内容是学习"The Definitive Gui ... -
Eclipse Action 深入学习笔记(3)
2007-11-25 17:59 4088filter元素是用来指定当 ... -
Eclipse Action 深入学习笔记(2)
2007-11-25 17:14 5218Object Action 这种Action是跟弹出的上下文菜 ... -
Eclipse Action 深入学习笔记(1)
2007-11-25 17:07 7672以前做插件用到的ActionSet都只是依葫芦画瓢,没有真正理 ... -
JFace Text Editor完全掌握之终极指南(4)
2007-11-24 17:08 5677错误标识(Error Marking) Error Marki ... -
JFace Text Editor完全掌握之终极指南(3)
2007-11-24 16:56 5506内容大纲 之所以要给编 ... -
JFace Text Editor完全掌握之终极指南(2)
2007-11-24 16:53 6734最后一步就是实现各种功能 语法高亮 首先我们要实现的是语法高亮 ... -
JFace Text Editor完全掌握之终极指南(1)
2007-11-24 16:17 9997JFace Text Editor是JFace里面一个功能强大 ... -
最近的Eclipse plugin开发总结
2007-11-24 11:30 4942List控件没有提供addDblClickListener方法 ... -
eclipse3.3关于JavaFileEditorInput兼容性问题的解决
2007-11-24 11:22 4676在eclipse3.3中,JavaFileEditor ... -
Eclipse WTP Projects Facets实战指南(2)
2007-11-21 21:13 5257修饰工作 给facet在选择列表中添加图标 格式如下: xml ... -
Eclipse WTP Projects Facets实战指南(1)
2007-11-21 20:21 9588这个文章基本是"Building Project F ... -
也说关于WizardPage的动态生成
2007-11-05 14:26 5159在Eclipse中一个Wizard=Wiza ... -
关于多页编辑器中不同Editor之间的Redo&Undo冲突的解决
2007-09-03 15:17 4061在我们的插件工具的开 ... -
TextEditor原理分析笔记
2007-08-23 15:48 3383Editor的语法着色原理:Eclipse使用damage , ... -
最近的Eclipse开发总结
2007-08-23 15:46 2122java.lang.IllegalAccessError: t ...
相关推荐
总之,基于Eclipse的EMF插件开发图形化编辑程序是一项复杂但强大的技术,它可以帮助我们构建高度定制、模型驱动的软件系统。通过理解EMF的概念、插件开发原理以及图形化编辑的实现方法,开发者可以创建出直观、高效...
通过阅读这份文档,读者可以了解到如何创建、编辑和解析EMF文件,以及EMF在应用程序中的使用方式,比如打印、图像处理和图形显示。 **emf.hlp**:这是一个帮助文件,通常用于提供快速查询和参考。在这个文件中,...
通过这个入门系列的学习,新手开发者将能够熟练运用EMF和GEF构建高效、直观的图形用户界面和模型驱动的应用程序,提升软件开发的效率和质量。同时,这也为深入研究更高级的MDD(Model Driven Development)技术打下...
【标签】"emf runtime 2.7.2" 指的是这个组件是EMF框架的运行时部分,主要负责在Eclipse环境中运行由EMF生成的模型驱动的应用程序。版本2.7.2表示这个运行时环境包含了针对该框架的一系列改进和修复,以确保与不同...
- **32位兼容性**:作为WMF的32位版本,EMF能够更好地支持现代操作系统和软件应用程序。 - **可扩展性**:EMF格式的设计考虑到了未来可能的需求,具有良好的扩展能力,能够容纳更多的图形信息和特性。 - **高效性**...
EMF(Eclipse Modeling Framework)是Eclipse项目中的一个子项目,它提供了一套用于构建模型驱动的开发工具和应用程序的框架。EMF的主要目标是简化元数据驱动应用的开发过程,通过将模型与代码生成、编辑器、验证器...
在本文中,我们将深入探讨Eclipse中的图像界面设计工具——Visual Editor(VE)插件,以及如何在Eclipse 3.2版本中安装它,同时涉及与VE相关的EMF(Eclipse Modeling Framework)和GEF(Graphical Editing Framework...
EMF、XSD、GEF和Visual Editor的结合使用,使得开发人员能够高效地创建复杂的模型驱动应用程序,尤其是在处理结构化数据和图形界面设计时。这个SDK提供了完整的工具链,帮助开发者从模型定义到界面实现一站式开发,...
结合这些组件,开发者可以利用Eclipse 3.3,EMF 2.20,GEF 3.2和VE 1.2来构建强大的模型驱动和图形化的应用程序,这些应用程序不仅具有丰富的用户界面,还能处理复杂的模型数据。通过EMF,开发者可以定义和操作数据...
《Eclipse开发使用GEF和EMF》是IBM红皮书系列中的一部经典著作,主要探讨了如何在Eclipse环境中利用GEF(图形编辑框架)和EMF( Eclipse模型框架)进行图形化应用程序的开发。这两项技术是Eclipse平台上的核心组件,...
EMF提供了运行时环境(EMF Runtime),使得模型可以在应用程序中被实例化、修改和保存。这个环境支持动态加载和解析模型,以及持久化模型到磁盘。 6. **EMF插件** 插件是EMF生态系统的重要组成部分,它们扩展了...
EMF是Eclipse项目的一部分,它提供了一个用于构建基于模型的应用程序的框架和工具。在这一版本的更新中,开发者可能引入了新的功能、修复了已知问题或提升了性能。 【描述】提到的“EMF-runtime-2.7.1.zip”是EMF...
EMF(Eclipse Modeling Framework)是Eclipse基金会提供的一种强大的模型化框架,它主要用于构建基于模型的应用程序。在处理XML数据时,EMF提供了一种高效且灵活的方式,能够将XML文档转换为可操作的对象模型,进而...
本书是针对 Eclipse 建模框架(EMF)的全面修订版本,为读者提供了深入的指导、洞察力以及实际应用案例,帮助开发者利用 EMF 构建高效的应用程序。 #### 二、EMF 的核心概念与技术 1. **模型定义**: - **Java**...
基于Eclipse的模型框架 它是Eclipse MDA(Model Driven Architecture)的一个重要组成部分 是Eclipse中许多项目的基础 e g GEF EMF可以将模型转换成高效的 正确的 和易于定制的Java代码
EMF,另一方面,是Microsoft Windows操作系统中的一个元文件格式,它可以存储矢量和光栅图形信息,适合在Windows应用程序之间交换图形数据。 这个"SVG转EMF"的示例代码提供了在Java环境下进行这种转换的方法。首先...
- VE提供了可视化的设计工具,允许开发者拖放控件来创建Java Swing或SWT/JFace应用程序的用户界面。这极大地简化了UI设计过程,减少了手动编写XML布局代码的需求。 - VE支持多种视图,如设计视图、源码视图和大纲...