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. CCF CSP认证考试试题

    1. 201803-1 跳一跳 试题编号: 201803-1 试题名称: 跳一跳 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 近来,跳一跳这款小游戏风靡全国,受到不少玩家的 ...

  2. WebApi的调用-2.后台调用

    httpClient调用方式 namespace SOA.Common { //httpClient调用WebApi public class HttpClientHelper { public st ...

  3. mydate97时间控件的使用

    mydate97官网: http://www.my97.net/dp/index.asp 1:用法如下所示,首先下载一个这个东西: 链接:http://pan.baidu.com/s/1kVmIckv ...

  4. ctsc2018

    day1: 8:20分还不知道考场在哪给ccf差评 8:30开始看题 第一题感觉是个模拟啊 很烦 瞄了一眼第二题第三题题意挺简单的啊感觉还不错 然后开始仔细看t1 然后我发现好像可以退狮子 应该是个数 ...

  5. 【AtCoder】Tenka1 Programmer Contest

    C - 4/N 列出个方程枚举解一下 #include <bits/stdc++.h> #define fi first #define se second #define pii pai ...

  6. c# windows服务如何获取自己的安装路径

    public static string GetWindowsServiceInstallPath(string ServiceName)        {            string key ...

  7. 045 介绍UDF,以及完成大小写的转换

    一:概述 1.UDF 用户自定义函数,用java实现自定义的需求 User Defined Function-----UDF. 2.UDF的类型 udf:一进一出 udaf:多进一出 udtf:一进多 ...

  8. Python3 - 基础知识、基本了解

    一.Python到底是什么? (抄自 金角大王) 1. Python是一门解释型语言? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去, ...

  9. HDU 2955_Robberies 小偷抢银行【01背包】

    <题目链接> 题意: 先是给出几组数据,每组数据第一行是总被抓概率p(最后求得的总概率必须小于他,否则被抓),然后是想抢的银行数n.然后n行,每行分别是该银行能抢的钱数m[i]和被抓的概率 ...

  10. HTTP协议学习笔记(二)

    HTTP协议学习笔记(二) 1.HTTP报文 HTTP报文:用于HTTP协议交互的信息.请求报文:请求端(客户端)的HTTP报文叫做请求报文.响应报文:响应端(服务端)的HTTP报文叫做响应报文. H ...