org.eclipse.ui.menus

locationURI

MenuContribution locationURI = “[Scheme]:[id]?[argument-list]”

1.menu or toolbar

2. problem view

popup:org.eclipse.ui.views.ProblemView?after=

org.eclipse.ui.main.menu?after=

org.eclipse.search.menu?dialogGroup

org.eclipse.ui.popupMenus

popup:org.eclipse.ui.views.ProblemView?after=additions

popup:org.eclipse.ui.popup.any?after=additions

steps:

1.extension from menus

2.the menu location in where

location url

How do you find the locationURI of menu contributions?

If you use ALT+SHIFT+F1 on the view, it will list the IDs of registered context menus

http://www.eclipse.org/pde/incubator/spy/

Tip: Subclass AbstractHandler rather than implementing IHandler.

menu ‘s handler

import org.eclipse.core.commands.AbstractHandler;

IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event);
        MessageDialog.openInformation(
                window.getShell(),
                "Demo",
                "Hello, Eclipse world");

操作步骤:

1. 添加org.eclipse.ui.commands扩展,创建一个command

2. 添加org.eclipse.ui.menus扩展,创建一个menuContribution

3. 添加org.eclipse.ui.handlers扩展,创建一个handler,command id指向步骤1中创建的command,并为其编写实现类

4. 为步骤3中创建的handler指定激活状态的表达式

要点:

1.

Q:新建command时,是否需要为其指定catagory属性?

A:看情况。我个人感觉catagory就是用来进行菜单分组的。例如,一般一个插件会把自己提供的菜单指定一个统一的catagory,这样在显示或处理时能放在一起

2.

Q:新建command时,是否需要为其指定name属性?

A:name属性是必填项,当然要指定了 :-) 当对应的menu没有指定label时,菜单中显示的就是这个name了。

3.

Q:menu的locationURI如何指定?

A:这是我碰到的第一个难题,因为uri需要用一个描述脚本编写,那么如何编写脚本?编写脚本的规则是什么? 答案就在eclipse的帮助文档中: http://help.eclipse.org/stable/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/workbench_cmd_menus.htm

举例:popup:org.eclipse.debug.ui.DebugView?after=additions

可以把这个示例uri看成3部分,第一部分是“popup”,代表样式是右键弹出菜单;第二部分是 “org.eclipse.debug.ui.DebugView”,含义是显示在哪个view的弹出菜单中;第三部分是 “after=additions”,含义是显示在弹出菜单的什么位置(弹出菜单中还有其他的菜单项)。

这个只是uri众多写法的其中之一,还有向主菜单添加项目的,向工具栏添加项目的,具体情况请参考上面的帮助文档链接。

进行到这里,菜单应该已经可以在debug窗口中显示出来了,但是这又引发了一个问题:每当点击这个菜单的时候,总是报告:The chosen operation is not enabled。这是因为handler的实现类直接实现了IHandler接口,其isHandled,isEnabled方法由eclipse自动生成的情况下全部是返回false的,除非必要,否则一般情况下应采用继承org.eclipse.core.commands.AbstractHandler的方式来编写handler的实现类,可以省去不少麻烦。

其中要注意的是:在plugin编辑器中,点击handler的属性面板中的“class”链接,会自动创建实现类,这个自动创建的实现类不是继承AbstractHandler的,而是直接实现IHandler,我就是这样被带到沟里去的。

报错的问题解决了,但是发现新增的菜单在有选中堆栈和没有选中堆栈的情况下都可以显示,这个有些不大合适,因为如果要复制堆栈信息,至少应该有一条被选中才可以。所以应该采取措施让这个菜单在没有选中任何堆栈信息时灰显,这也就引出了另一个很难理解的框架:command core expression。

command core expression是一个脚本规则,eclipse定义了许多变量、属性,通过core expression可以对这些变量、属性进行诸如instanceof, equals等判定,从而得到一个boolean值用来参与程序的逻辑。针对这个问题,我们只需要为handler指定enabledWhen的表达式(core expression),让handler只在选中已条堆栈信息时才被激活即可。

core expression的文档在:http://wiki.eclipse.org/Command_Core_Expressions 在 org.eclipse.ui.handlers 扩展的声明文档中也有很多可以参考的信息。

在本例中我们通过对selection变量的计数来判断是否有堆栈信息被选定。详细内容请参考本文后面的plugin.xml文件的内容。

至此,添加菜单的过程就结束了,看似简单,其实牵涉了许多其他的应用技术,例如core expression, locationURI等。其他的问题其实也是一样,不断地遇到问题,不断地踩平它,不断地积累,慢慢地,一条路就会出现在脚下。

eclipse plugin development -menu的更多相关文章

  1. How to programmatically new a java class which implements sepecified interface in eclipse plugin development

    http://w3facility.org/question/how-to-programmatically-new-a-java-class-which-implements-sepecified- ...

  2. eclipse preference plugin development store and get

    eclipse plugin development: E:\workspaces\Eclipse_workspace_rcp\.metadata\.plugins\org.eclipse.pde.c ...

  3. Peer Code Reviews Made Easy with Eclipse Plug-In

    欢迎关注我的社交账号: 博客园地址: http://www.cnblogs.com/jiangxinnju/p/4781259.html GitHub地址: https://github.com/ji ...

  4. Installing the Eclipse Plugin

    Installing the Eclipse Plugin Android offers a custom plugin for the Eclipse IDE, called Android Dev ...

  5. The J-Link hardware debugging Eclipse plug-in

    Quicklinks If you already know what are the features of the new plug-in and just want to know how to ...

  6. Eclipse plugin插件开发 NoClassDefFoundError

    Eclipse的每一个plugin都有属于自己的类加载器,这是OSGI架构的基础,每一个plugin项目都是一个bundle,独立运行在各自的运行环境里面,这就造成了开发时和运行时的不同. Eclip ...

  7. How to setup Eclipse with WinAVR and the Eclipse plugin AVR-eclipse

    源:How to setup Eclipse with WinAVR and the Eclipse plugin AVR-eclipse Arduino development with Eclip ...

  8. 快速掌握Eclipse Plugin / RCP开发思想

    本文转载:https://my.oschina.net/drjones/blog/280337 引言 本文不是快速入门的文章,只面向有一定基础的开发人员,至少看这篇文章之前你应该了解什么是Eclips ...

  9. Tips For Your Maya Plugin Development

    (The reason why I write English blog is that I'm trying to improve my written English. The Chinese v ...

随机推荐

  1. python 全栈开发,Day22(封装,property,classmethod,staticmethod)

    一.封装 封装 : 广义上的 :把一堆东西装在一个容器里 狭义上的 :会对一种现象起一个专门属于它的名字 函数和属性装到了一个非全局的命名空间 —— 封装 隐藏对象的属性和实现细节,仅对外提供公共访问 ...

  2. Timber(对Log类封装的一个工具)

    Timber(对Log类封装的一个工具) https://blog.csdn.net/hzl9966/article/details/51314137 https://www.jianshu.com/ ...

  3. 查看Windows系统里的进程已运行的时间

    搜索 ProcessExplorer ,可以去微软下载它.右键点击项类,selcet conlumns...在 Process Performance 里 选择start time.有了进程的启动时间 ...

  4. POJ 3187【permutation】

    POJ 3187 给定N值,从而确定了数据的范围及长度,暴力枚举数列,接下来类似杨辉三角的递推计算.注permutation从递增有序数列开始枚举,枚举到符合sum值时退出即可 #include &l ...

  5. tomcat常用的配置

    这里我们使用tomcat版本:apache-tomcat-7.0.77-windows-x64.zip 为例:下载链接地址为:https://archive.apache.org/dist/tomca ...

  6. 【Java】 剑指offer(60) n个骰子的点数

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s.输入n,打 ...

  7. Unity 之 rawimage 与image 的区别

    http://www.newbieol.com/information/740.html

  8. Redis工具类

    /** * Copyright © 2012-2016 * <a href="https://github.com/thinkgem/smkj">smkj</a& ...

  9. python常用模块之时间模块

    python常用模块之时间模块 python全栈开发时间模块 上次的博客link:http://futuretechx.com/python-collections/ 接着上次的继续学习: 时间模块 ...

  10. VsVim - Shortcut Key (快捷键)

    Enable / Disable NuGet 中提供了禁用按钮.另外还可以通过 Ctrl+Shift+F12 在 Visual Studio 中实现 Enable / Disable. 移动光标类命令 ...