GMF 教程 Mindmap 5

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

这一部分主要实现的是:

使用扩展的Plug-in为我们的Diagram添加一个自定义动作

Creating a Customization Plug-in

尽管可以给生成的代码添加备注@generated NOT来避免下次重新生成代码时覆盖我们修改的代码,除此之外,还可以使用一个新的Plug-in工程来将自定制(扩展)与生成的工程分离。

1、创建一个新的Plug-in工程,命名为org.eclipse.gmf.examples.mindmap.diagram.custom,使用默认的设置,不要Activator类,也不用向导提供的任何模板。

Custom Actions

目前为止创建一个新的Subtopic的方法比较麻烦,需要频繁点击工具。现在希望给Topic结点添加右击菜单项Create Subtopic来实现这个操作,直接创建Subtopic结点,包括连线。

首先,我们要知道,org.eclipse.ui.bindings可以用来将Ctrl+I组合键(或者其他组合键)分配给我们的Action。可以通过修改diagram.custom工程的plugin.xml文件来实现。不过刚创建的新工程没有这个文件,不过没关系。

2、打开diagram.custom工程的MAINIFEST.MF,选择标签Extension,单击Add,添加org.eclipse.ui.bindings扩展点:

3、其实之前单击Add的时候,就会自动创建plugin.xml文件了。然后可以直接编辑这个文件,在<plugin>标签之间添加内容:

<extension point="org.eclipse.ui.bindings"><key commandId="org.eclipse.gmf.examples.mindmap.insertSubtopic"sequence="M1+I" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
</extension>

4、为了这个命令,需要使用org.eclipse.ui.command扩展点。在plugin.xml文件中添加如下内容:

<extension point="org.eclipse.ui.commands"><category name="Mindmap" description="Commands related to Mindmap diagrams."id="org.eclipse.gmf.category.mindmap" /><command categoryId="org.eclipse.gmf.category.mindmap"description="Inserts a new subtopic" id="org.eclipse.gmf.examples.mindmap.insertSubtopic"name="Insert Subtopic"></command>
</extension>
5、现在,为了弹出菜单,要使用org.eclipse.ui.popupMenus扩展点
<extension point="org.eclipse.ui.popupMenus"><objectContribution adaptable="false"id="org.eclipse.gmf.examples.mindmap.diagram.ui.objectContribution.TopicEditPart1"objectClass="org.eclipse.gmf.examples.mindmap.diagram.edit.parts.TopicEditPart"><menu id="MindmapInsert" label="Insert" path="additions"><separator name="group1"></separator></menu><actionclass="org.eclipse.gmf.examples.mindmap.diagram.part.MindmapCreateSubtopicAction"definitionId="org.eclipse.gmf.examples.mindmap.insertSubtopic"enablesFor="1"id="org.eclipse.gmf.examples.mindmap.popup.MindmapCreateSubtopicActionID"label="Subtopic" menubarPath="MindmapInsert/group1"></action></objectContribution>
</extension>

6、不过,为了使生效,要在MAINIFEST.MF加入:

Import-Package: org.eclipse.gmf.examples.mindmap.diagram.edit.parts

7、现在,如果运行程序,右击Topic结点,可以看到上下文菜单多了Insert:

8、之后,要实现那个Action。

在diagram.custom工程的src下创建包org.eclipse.gmf.examples.mindmap.diagram.part,然后创建类MindmapCreateSubtopicAction,完整代码在后边的下载地址。

不过,要按照提示添加各种Import-package,参考下图:

注意要添加左边的org.eclipse.gmf.runtime.diagram.ui,否则程序会提示org.eclipse.gmf.runtime.notation.View cannot be resolved。

9、此时运行程序,先创建一个Topic结点,然后右击,选择Insert——Subtopic,会自动在右上方的创建一个Topic结点,并带有连线:

Custom Layout

默认的布局并不适合mindmap。下面要实现的是给diagram添加一个自定义的布局,虽然很简单,但是却指明了方法。还是会使用扩展点来实现。

我们将会尝试两中布局:一个是继承自

org.eclipse.gmf.runtime.diagram.ui.providers.LeftRightProvider

另一个继承自

org.eclipse.gmf.runtime.diagram.ui.providers.internal.RadialProvider

10、在工程的dependancies中加入org.eclipse.gmf.runtime.diagram.ui.providers。

11、在plugin.xml中加入扩展:

<extension point="org.eclipse.gmf.runtime.diagram.ui.layoutProviders"><layoutProviderclass="org.eclipse.gmf.examples.mindmap.diagram.layout.MindmapDefaultLayoutProvider"><Priority name="Medium" /></layoutProvider>
</extension>
<extension point="org.eclipse.gmf.runtime.diagram.ui.layoutProviders"><layoutProviderclass="org.eclipse.gmf.examples.mindmap.diagram.layout.MindmapRadialLayoutProvider"><Priority name="Low" /></layoutProvider>
</extension>

12、然后创建包org.eclipse.gmf.examples.mindmap.diagram.layout,在包中创建两个类MindmapDefaultLayoutProvider和MindmapRadialLayoutProvider,代码见下载地址。

运行,但是我看不出来有什么效果。

Removing Tools from the Palette

13、如果不想要palette上的Notes和Zoom工具,可以在自定义的工程中使用paletteProvider扩展点来实现移除这些工具。在diagram.custom工程的plugin.xml加入:

<extension point="org.eclipse.gmf.runtime.diagram.ui.paletteProviders"><paletteProviderclass="org.eclipse.gmf.runtime.diagram.ui.providers.DefaultPaletteProvider"><Priority name="High" /><contribution><predefinedEntry id="standardGroup/selectionTool"remove="false" /><predefinedEntry id="standardGroup/zoomInTool"remove="true" /><predefinedEntry id="standardGroup/zoomOutTool"remove="true" /><predefinedEntry id="standardGroup/noteStack/noteTool"remove="true" /><predefinedEntry id="standardGroup/noteStack/textTool"remove="true" /><predefinedEntry id="standardGroup/noteStack/noteattachmentTool"remove="true" /></contribution><editorid="org.eclipse.gmf.examples.mindmap.diagram.part.MindmapDiagramEditorID"></editor></paletteProvider>
</extension>

14、此时运行的话,会发现只有Select工具还在palette上,而原来的Note工具和缩放工具都移除了:

源码:http://www.oschina.net/code/snippet_164134_19308

双子座@开源中国:http://my.oschina.net/plumsoft

转载于:https://my.oschina.net/plumsoft/blog/114354

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

invalid use of incomplete type struct 或者是class的解决办法

在写完代码之后进行编译时&#xff0c;提示"invalid use of incomplete type struct" 或者 "invalid use of incomplete type class" 的解决办法&#xff1a; 1、对应的头文件要包含&#xff0c;这个是必须的。 当时因为没有包含头文件&#xff0c;也汇报…

ASP.NETLinkButton的Click事件中获取CommandArgument的值

/// <summary> /// LinkButton的onClick事件 /// </summary> /// <param name"sender"></param> /// <param name"e"></param> protected void linkBtnName_Click(object sender, EventArgs e) { …

Linux的proc文件系统详解

引用自&#xff1a;http://bbs.chinaunix.net/thread-2002769-1-1.html Linux系统上的/proc目录是一种文件系统&#xff0c;即proc文件系统。与其它常见的文件系统不同的是&#xff0c;/proc是一种伪文件系统&#xff08;也即虚拟文件系统&#xff09;&#xff0c;存储的是当前…

Jmeter(四十二)_控制器下遍历一组参数

概述 在接口自动化的过程中&#xff0c;经常遇到需要遍历的参数组。jmeter在中&#xff0c;foreach控制器可以实现遍历参数&#xff0c;但是只能有一个入参。一旦遇到数组&#xff0c;foreach控制器表示我也无能为力。。。 为了解决这个问题&#xff0c;今天教大家一个实现数组…

模板类的定义和实现可以分开吗?

一个模板&#xff0c;在a.h中定义&#xff0c;在a.cc中实现&#xff0c;这样可以吗&#xff1f; 答案是不行的。 模板的定义和实现需要都写在头文件中。 有一种特例可以实现模板的定义和实现分别放在a.h 和 a.cc中&#xff0c;但是需要指定参数的类型。 但是这样导致每传入一…

业界资讯:adobe air 2.7 beta发布

http://labs.adobe.com/technologies/flashplatformruntimes/air2-7/ 前一段时间adobe 更新air 2.6的消息提升了air 性能 使进去移动平台性能得到改善&#xff0c;而今天adobe lab 再次放出adobe air2.7 beta版本 更新消息&#xff0c;这次更新会大幅提升 和改进一些功能&#…

JS 停留几秒后返回上一页

2019独角兽企业重金招聘Python工程师标准>>> <script type"text/javascript" language"javascript"> var i 5; intervalid setInterval("fun()", 1000); function fun(){if(i0){history.go(-1);clearInterval(intervalid);}i…

spring boot 分布式锁组件 spring-boot-klock-starter

基于redis的分布式锁spring-boot starter组件&#xff0c;使得项目拥有分布式锁能力变得异常简单&#xff0c;支持spring boot&#xff0c;和spirng mvc等spring相关项目 快速开始 spring boot项目接入 1.添加lock starter组件依赖&#xff0c;目前还没上传到公共仓库&#xff…

std::string中的find_first_of()和find_last_of()函数

编程语言: c/linux 在std::string中&#xff0c;有时需要找到一个string中最后一个或者第一个以某个特定的字符开始的位置或者下标&#xff0c;这时就需要使用find_first_of()和find_last_of()函数。 find_first_of() &#xff1a; 找到一个string中第一个以 某个 字符开始的…

Adsense加入黑名单的预防办法

说说预防被例如黑名单的办法。 GOOGLE同样知道竞争对手在点你的广告&#xff0c;这也会被记录在案&#xff08;Adsense同样知道他们的地理位置&#xff09;。 如果发现网站广告点击有异常情况&#xff0c;应该及时通知Google相关人员。万一被Google Adsense除名了&#xff0c;也…

【学习笔记4】Action名称的搜索顺序

2019独角兽企业重金招聘Python工程师标准>>> 1&#xff0e;获得请求路径的URI&#xff0c;例如url是&#xff1a;http://server/struts2/path1/path2/path3/test.action 2&#xff0e;首先寻找namespace为/path1/path2/path3的package&#xff0c;如果不存在这个pac…

std::map中的lower_bound与upper_bound

最近在工作中遇到了std::map中的lower_bound与upper_bound&#xff0c;再次记录下其功能和使用方式。 std::map<char, int> mp; mp.lower_bound<key> &#xff1a; 返回的是第一个大于、等于key的iterator&#xff0c;如果没有则返回空。 mp.upper_bound<key…

函数初识

函数#1.函数的定义 def#2.函数的调用#3.函数的返回值 return#4.函数的参数 #形参&#xff1a; # 位置参数 &#xff1a; 必须传 # *args &#xff1a;可以接收任意多个位置参数 # 默认参数 &#xff1a; 可以不传 # **kwargs &#xff1a; 可以…

MongoDB 初学

大致看了一点 MongoDB. 回忆一下&#xff0c;这个数据库有这样一些特征&#xff1a; Schema-less: 不需要预先定义 schema. 数据以 document 的方式存储&#xff0c;document 大致上相当于关系数据库中的一行记录。document 存放在 collection 中间&#xff08;相当于关系数据库…

STL中的set/map

std::set/std::map底层实现的机制是红黑树&#xff0c;树中的数据是有序的&#xff0c;那么进行插入、删除、查找时的平均时间复杂读O(logN),以2为低的对数N。set相当于map中的key&#xff0c;map中的key不能有重复的并且按升序进行排序&#xff0c;如果结构体作为map中的key&a…

IoC容器Autofac(3) - 理解Autofac原理,我实现的部分Autofac功能(附源码)

上篇文章中&#xff0c;举了一个Autofac的简单例子&#xff0c;园友eflay反应: “虽然对autofac架构原理还是完全不懂&#xff0c;不过基本是明白ioc的用途了&#xff0c;会从已注册的类中找出符合接口的类来调用构造函数进行构造” 所以这篇文章&#xff0c;还是针对上次的例子…

STATS 4014 Advanced Data Science

STATS 4014Advanced Data ScienceAssignment 3Jono TukeSemester 1 2019CHECKLIST: Have you shown all of your working, including probability notation where necessary? : Have you given all numbers to 3 decimal places unless otherwise stated? : Have you include…

铁血规则:事件预订与取消预订

在编码的时候&#xff0c;我们经常预订某个事件来处理它&#xff0c;但很少取消事件的预订&#xff0c;这种做法可能导致程序在运行时出现一些异常。 如果你的某个用于处理事件的对象不是在运行期内永久存在的&#xff08;比如&#xff0c;不是Singleton对象&#xff09;&#…

MySQL中的insert ignore into讲解

最近工作中&#xff0c;使用到了insert ignore into语法&#xff0c;感觉这个语法还是挺有用的&#xff0c;就记录下来做个总结。 insert ignore into : 忽略重复的记录&#xff0c;直接插入数据。 包括两种场景&#xff1a; 1、插入的数据是主键冲突时 insert ignore into…

[置顶] 我的iOS作品

我的iOS作品 罗朝辉 ( http://blog.csdn.net/kesalin)CC 许可&#xff0c;转载请注明出处前言 做了好几年的 iOS 开发了&#xff0c;业余也零零散散地写了不少代码和博文教程。可惜一直都没有整理下&#xff0c;上次过年回家在张江广兰路把笔记本给丢了&#xff0c;损失惨重&am…