快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

葡京娱乐场娱乐网址:EclipseGEF入门系列(六、添加菜单和工具条)



我发明一旦稍稍体会到GEF的妙处,就会很自然的被它吸引住。不仅是由于用葡京娱乐场娱乐网址它做出的图形界面好看,更紧张的是,UI中最繁杂和细微的问题,在GEF的设计中无不被殷勤的斟酌并以适当的模式办理,当你懂得了这些,完全可以把这些办理措施加以转换,用来办理其他领域的设计问题。去年黄老大年夜在一个GEF项目停止后,仍旧没有放弃对它的继承钻研,现在以葡京娱乐场娱乐网址致使用业余光阴开拓了基于GEF的SWT/JFace增强软件包,Eclipse和GEF的魅力可见一斑。我信托在未来的两年里,因为RCP/GEF等技巧的成熟,Java Standalone利用法度榜样必将有所成长,在B/S模式难以实现的那部分领域里扮演紧张的角色。

本篇的主题是实现菜单功能,因为Eclipse的可扩展设计,在GEF利用法度榜样中添加菜单要多几处斟酌,以是我首先先容Eclipse里关于菜单的一些观点,然后再经由过程实例描述若何在GEF里添加菜单、对象条和高低文菜单。

我们知道,Eclipse本身只是一个平台(Platform),用户并不能葡京娱乐场娱乐网址直接用它来事情,它的感化是为那些供给实际功能的部件供给一个根基情况,所有部件都经由过程平台指定的要领构造界面和应用资本。在Eclipse里,这些部件被称为插件(Plugins),例如Java开拓情况(JDT)、Ant支持、CVS客户端和赞助系统等等都是插件,因为我们从eclipse.org下载的Eclipse本身已经包孕了这些常用插件,以是不必要额外的安装,就好象Windows本身已经包孕了记事本、画图等等对象一样。假如我们必要新功能,就要经由过程下载安装或在线更新的要领把它们安装到Eclipse平台上,常见的如XML编辑器、Properties文件编辑器,J2EE开拓支持等等,包括GEF开拓包也是这类插件。插件一样平常都安装在Eclipse安装目录的plugins子目录下,也可以应用link要领安装在其他位置。

Eclipse平台的一个优秀之处在于,如斯浩繁的插件能够完美的集成在同一个情况中,要知道,每个插件都可能具有编辑器、视图、菜单、对象条、文件关联等等繁杂元素,要让它们能够和平共处可不是件轻易事。为此,Eclipse供给了一系列机制来办来由此带来的各类问题。因为篇幅限定,这里只能简单讲一下菜单和对象条的部分,更多内容请参考Eclipse随机供给的插件开拓赞助文档。

大年夜多半环境下,我们说开拓一个基于Eclipse的利用法度榜样便是指开拓一个Eclipse插件(plugin),Eclipse里的每个插件都有一个名为plugin.xml的文件用来定义插件里的各类元素,例如这个插件都有哪些编辑器,哪些视图等等。在视图中应用菜单和对象条请参考曩昔的贴子,本篇只先容编辑器的环境,由于GEF利用法度榜样大年夜多半是基于编辑器的。

图1 Eclipse平台的几个组成部分

首先要先容Retarget Action的观点,这是一种具有必然语义但没有实际功能的Action,它独一的感化便是在主菜单条或主对象条上盘踞一个项位置,编辑器可以将具有实际功能的Action映射到某个Retarget Action,当这个编辑器被激活时,主菜单/对象条上的那个Retarget Action就会具有那个Action的功能。举例来说,Eclipse供给了IWorkbenchActionConstants.COPY这个Retarget Action,它的翰墨和图标都是预先定义好的,假设我们的编辑器必要一个"复制节点到剪贴板"功能,由于"复制节点"和"复制"这两个词的语义十分邻近,以是可以新建一个具有实际功能的CopyNodeAction(extends Action),然后在适当的位置调用下面代码实现二者的映射:

可以看到,DiagramActionBarContributor类承袭自GEF供给的类ActionBarContributor,后者是实现了IEditorActionBarContributor接口的一个抽象类。buildActions()措施用于创建那些要添加到主菜单/对象条的Retarget Actions,并把它们注册到一个专门的注册表里;而contributeToMenu()措施里的代码把这些Retarget Actions实际添加到主菜单栏,应用IMenuManager.insertAfter()是为了让新加的菜单呈现在指定的系统菜单后面,contributeToToolBar()里则是添加到主对象条的代码。

图2 添加到主菜单条和主对象条上的Action

GEF 在ActionBarContributor里掩护了retargetActions和globalActionKeys两个列表,此中后者是一个Retarget Actions的ID列表,addRetargetAction()措施会把一个Retarget Action同时加到二者中,对付已有的Retarget Actions,我们应该在declareGlobalActionKeys()措施里调用addGlobalActionKey()措施来声明,在一个编辑器被激活的时刻,与globalActionKeys里的那些ID具有相同ID值的(具有实际功能的)Action将被联系到该ID对应的Retarget Action,是以就不必要显式的去调用setGlobalActionHandler()措施了,只要包管二者的ID相同即可实现映射。

GEF已经内置了取缔/重做和删除这三个操作的Retarget Action(由于太常用了),它们的ID分手是IWorkbenchActionConstants.UNDO、REDO和DELETE,以是没有什么问题。而设置优先级这个Action没有语义邻近的现成Retarget Action可用,以是我们自己要先定义一个PriorityRetargetAction,内容如下(没有颠末国际化处置惩罚):

GEF供给的UNDO/REDO/DELETE等Action会根据当前选择的editpart(s)自动判断自己是否可用,我们定义的Action则要自己在Action的calculateEnabled()措施里谋略。别的,为了实现取缔/重做的功能,一样平常Action履行的时刻要建立一个Command,将后者加入CommandStack里,然后履行这个Command工具,而不是直接把履行代码写在Action的run()措施里。下面是我们的设置优先级PriorityAction的部分代码,该类承袭自SelectionAction:

public void run() {

execute(createCommand());

}

private Command createCommand() {

List objects = getSelectedObjec葡京娱乐场娱乐网址ts();

if (objects.isEmpty())

return null;

for (Iterator iter = objects.iterator(); iter.hasNext();) {

Object obj = iter.next();

if ((!(obj instanceof NodePart)) && (!(obj instanceof NodeTreeEditPart)))

return null;

}

CompoundCommand compoundCmd = new CompoundComma葡京娱乐场娱乐网址nd(GEFMessages.DeleteAction_ActionDeleteCommandName);

for (int i = 0; i

您可能还会对下面的文章感兴趣: