如何使用 SourceProvider 根据条件启用和禁用菜单项 (eclipse rcp Indigo 3.7)

2023-12-23

我有一个 eclipse rcp (版本 Indigo 3.7)应用程序(eclipse 插件项目)。我阅读了 Lars Vogel 的教程“Eclipse Commands Advanced”(修订版 0.2-2.1,2009 年 4 月 11 日-2011 年 9 月 24 日)。

首先,我使用带有菜单和一些命令的 menuContribution 创建了菜单扩展。

其次,我使用一些命令创建了命令扩展。

第三,我定义了处理程序扩展(具有启用时表达式的处理程序)。

第四,我用变量编写了服务扩展。

我的plugin.xml 看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
    <extension id="application" point="org.eclipse.core.runtime.applications">
        ...
    </extension>
    <extension point="org.eclipse.ui.perspectives">
        ...
    </extension>
    <extension id="product" point="org.eclipse.core.runtime.products">
        ...
    </extension>
    <extension point="org.eclipse.ui.views">
        ...
    </extension>
    <extension point="org.eclipse.ui.menus">
        <menuContribution allPopups="false" locationURI="menu:org.eclipse.ui.main.menu">
            <menu id="fileMenuItem" label="File" mnemonic="F">
                <command commandId="de.falk.rcp37.drawfigures.commands.new" id="newFileMenuItem" label="New" mnemonic="N" style="push">
                </command>
                <command commandId="de.falk.rcp37.drawfigures.commands.open" id="openFileMenuItem" label="Open..." mnemonic="O" style="push">
                </command>
                <separator name="de.falk.rcp37.drawfigures.menu.file.separator1" visible="true">
                </separator>
                <command commandId="de.falk.rcp37.drawfigures.commands.close" id="closeFileMenuItem" label="Close" mnemonic="C" style="push">
                </command>
                <separator name="de.falk.rcp37.drawfigures.menu.file.separator2" visible="true">
                </separator>
                <command commandId="de.falk.rcp37.drawfigures.commands.save" id="saveFileMenuItem" label="Save" mnemonic="S" style="push">
                </command>
                <command commandId="de.falk.rcp37.drawfigures.commands.saveas" id="saveAsFileMenuItem" label="Save as..." mnemonic="a" style="push">
                </command>
                <separator name="de.falk.rcp37.drawfigures.menu.file.separator3" visible="true">
                </separator>
                <command commandId="de.falk.rcp37.drawfigures.commands.exit" id="exitFileMenuItem" label="Exit" mnemonic="x" style="push">
                </command>
                <command commandId="de.falk.rcp37.drawfigures.commands.change" id="changeFileMenuItem" label="Change" mnemonic="h" style="push">
                </command>
            </menu>
        </menuContribution>
    </extension>
    <extension point="org.eclipse.ui.commands">
        <command id="de.falk.rcp37.drawfigures.commands.new" name="newFileCommand"></command>
        <command id="de.falk.rcp37.drawfigures.commands.open" name="openFileCommand"></command>
        <command id="de.falk.rcp37.drawfigures.commands.close" name="closeFileCommand"></command>
        <command id="de.falk.rcp37.drawfigures.commands.save" name="saveFileCommand"></command>
        <command id="de.falk.rcp37.drawfigures.commands.saveas" name="saveAsFileCommand"></command>
        <command id="de.falk.rcp37.drawfigures.commands.exit" name="exitFileCommand"></command>
        <command id="de.falk.rcp37.drawfigures.commands.change" name="changeFileCommand"></command>
    </extension>
    <extension point="org.eclipse.ui.handlers">
        <handler class="de.falk.rcp37.drawfigures.handler.NewHandler" commandId="de.falk.rcp37.drawfigures.commands.new"></handler>
        <handler class="de.falk.rcp37.drawfigures.handler.OpenHandler" commandId="de.falk.rcp37.drawfigures.commands.open"></handler>
        <handler class="de.falk.rcp37.drawfigures.handler.CloseHandler" commandId="de.falk.rcp37.drawfigures.commands.close">
            <enabledWhen>
                <with variable="de.falk.rcp37.drawfigures.miscellaneous.menuitemsstatesourceprovider.closestate">
                    <equals value="true"></equals>
                </with>
            </enabledWhen>
        </handler>
        <handler class="de.falk.rcp37.drawfigures.handler.SaveHandler" commandId="de.falk.rcp37.drawfigures.commands.save">
            <enabledWhen>
                <with variable="de.falk.rcp37.drawfigures.miscellaneous.menuitemsstatesourceprovider.savestate">
                    <equals value="true"></equals>
                </with>
            </enabledWhen>
        </handler>
        <handler class="de.falk.rcp37.drawfigures.handler.SaveAsHandler" commandId="de.falk.rcp37.drawfigures.commands.saveas">
            <enabledWhen>
                <with variable="de.falk.rcp37.drawfigures.miscellaneous.menuitemsstatesourceprovider.saveasstate">
                    <equals value="true"></equals>
                </with>
            </enabledWhen>
        </handler>
        <handler class="de.falk.rcp37.drawfigures.handler.ExitHandler" commandId="de.falk.rcp37.drawfigures.commands.exit"></handler>
        <handler class="de.falk.rcp37.drawfigures.handler.ChangeHandler" commandId="de.falk.rcp37.drawfigures.commands.change"></handler>
    </extension>
    <extension point="org.eclipse.ui.services">
        <sourceProvider provider="de.falk.rcp37.drawfigures.miscellaneous.MenuItemsStateSourceProvider">
            <variable name="de.falk.rcp37.drawfigures.miscellaneous.menuitemsstatesourceprovider.closestate" priorityLevel="workbench"></variable>
            <variable name="de.falk.rcp37.drawfigures.miscellaneous.menuitemsstatesourceprovider.savestate" priorityLevel="workbench"></variable>
            <variable name="de.falk.rcp37.drawfigures.miscellaneous.menuitemsstatesourceprovider.saveasstate" priorityLevel="workbench"></variable>
        </sourceProvider>
    </extension>
</plugin>

另外,我实现了 MenuItemsStateSourceProvider:

package de.falk.rcp37.drawfigures.miscellaneous;
import java.util.HashMap;
import java.util.Map;

import org.eclipse.ui.AbstractSourceProvider;

public class MenuItemsStateSourceProvider extends AbstractSourceProvider {
    public static final String ID = "de.falk.rcp37.drawfigures.miscellaneous.menuitemsstatesourceprovider";
    public static final String DRAWING_CLOSE_STATE = "de.falk.rcp37.drawfigures.miscellaneous.menuitemsstatesourceprovider.closestate";
    public static final String DRAWING_SAVE_STATE = "de.falk.rcp37.drawfigures.miscellaneous.menuitemsstatesourceprovider.savestate";
    public static final String DRAWING_SAVEAS_STATE = "de.falk.rcp37.drawfigures.miscellaneous.menuitemsstatesourceprovider.saveasstate";

    @Override
    public void dispose() {

    }

    @SuppressWarnings("rawtypes")
    @Override
    public Map getCurrentState() {
        HashMap<String, String> hashMap = new HashMap<String, String>();
        hashMap.put(ID, ID);
        hashMap.put(DRAWING_CLOSE_STATE, "false");
        hashMap.put(DRAWING_SAVE_STATE, "false");
        hashMap.put(DRAWING_SAVEAS_STATE, "false");
        return hashMap;
}

    @Override
    public String[] getProvidedSourceNames() {
        return new String[] { ID, DRAWING_CLOSE_STATE, DRAWING_SAVE_STATE, DRAWING_SAVEAS_STATE };
    }

public void setDrawingNewed(boolean drawingNewed) {
    if (ModelDefinitions.currentDrawing.getNewed() != drawingNewed) {
            ModelDefinitions.currentDrawing.setNewed(drawingNewed);
            fireSourceChanged(ISources.WORKBENCH, DRAWING_SAVEAS_STATE, ModelDefinitions.currentDrawing.getSaveAsStateString());
    }
}
public void setDrawingOpend(boolean drawingOpend) {
        if (ModelDefinitions.currentDrawing.getOpend() != drawingOpend) {
            ModelDefinitions.currentDrawing.setOpend(drawingOpend);
    fireSourceChanged(ISources.WORKBENCH, DRAWING_CLOSE_STATE, ModelDefinitions.currentDrawing.getCloseStateString());
            fireSourceChanged(ISources.WORKBENCH, DRAWING_SAVE_STATE, ModelDefinitions.currentDrawing.getSaveStateString());
            fireSourceChanged(ISources.WORKBENCH, DRAWING_SAVEAS_STATE, ModelDefinitions.currentDrawing.getSaveAsStateString());
        }
}
public void setDrawingChanged(boolean drawingChanged) {
        if (ModelDefinitions.currentDrawing.getChanged() != drawingChanged) {
            ModelDefinitions.currentDrawing.setChanged(drawingChanged);
            fireSourceChanged(ISources.WORKBENCH, DRAWING_SAVE_STATE, ModelDefinitions.currentDrawing.getSaveStateString());
        }
}
}

以及不同的处理程序:

public class ChangeHandler extends AbstractHandler {
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {

        // doing some CHANGE operations...

    // Get the source provider service
    ISourceProviderService sourceProviderService = (ISourceProviderService) HandlerUtil.getActiveWorkbenchWindow(event).getService(ISourceProviderService.class);
    // Now get my service
    MenuItemsStateSourceProvider menuItemsStateSourceProvider = (MenuItemsStateSourceProvider)sourceProviderService.getSourceProvider(MenuItemsStateSourceProvider.ID);
    menuItemsStateSourceProvider.setDrawingChanged(true);

    return null;
    }
}

or:

public class NewHandler extends AbstractHandler {
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {

        // doing some NEW operations...

    // Get the source provider service
    ISourceProviderService sourceProviderService = (ISourceProviderService) HandlerUtil.getActiveWorkbenchWindow(event).getService(ISourceProviderService.class);
    // Now get my service
    MenuItemsStateSourceProvider menuItemsStateSourceProvider = (MenuItemsStateSourceProvider)sourceProviderService.getSourceProvider(MenuItemsStateSourceProvider.ID);
    menuItemsStateSourceProvider.setDrawingNewed(true);
    menuItemsStateSourceProvider.setDrawingOpend(false);
    menuItemsStateSourceProvider.setDrawingChanged(false);

    return null;
}
}

等等(对于所有处理程序)...

最后在绘图课上:

public String getCloseStateString() {
    return (opend) ? "true" : "false";
}
public String getSaveStateString() {
    return (opend && changed) ? "true" : "false";
}
public String getSaveAsStateString() {
    return (opend || newed) ? "true" : "false";
}

public void setNewed(boolean newed) {
    this.newed = newed;
}
public void setOpend(boolean opend) {
    this.opend = opend;
}
public void setChanged(boolean changed) {
    this.changed = changed;
}

但没有任何作用!有人可以帮忙吗?

谢谢鲁莫


ISourceProvider.getCurrentState期望一个Map<String, Object>作为返回值(参见 Javadoc)。检查启用的处理程序使用Boolean值,而不是String.

如果你改变你的getCurrentState中的方法MenuItemsStateSourceProvider to

@SuppressWarnings("rawtypes")
@Override
public Map getCurrentState() {
  HashMap<String, Object> hashMap = new HashMap<String, Object>();
  hashMap.put(ID, ID);
  hashMap.put(DRAWING_CLOSE_STATE, Boolean.TRUE);
  hashMap.put(DRAWING_SAVE_STATE, Boolean.FALSE);
  hashMap.put(DRAWING_SAVEAS_STATE, Boolean.FALSE);
  return hashMap;
}

the Close菜单条目将被启用,其他条目将被禁用。 所有状态值必须是Boolean.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 SourceProvider 根据条件启用和禁用菜单项 (eclipse rcp Indigo 3.7) 的相关文章

  • 如何将本机库链接到 IntelliJ 中的 jar?

    我正在尝试在 IntelliJ 中设置 OpenCV 但是我一直在弄清楚如何告诉 IntelliJ 在哪里可以找到本机库位置 在 Eclipse 中 添加 jar 后 您可以在 Build Config 屏幕中设置 Native 库的位置
  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • Junit:如何测试从属性文件读取属性的方法

    嗨 我有课ReadProperty其中有一个方法ReadPropertyFile返回类型的Myclass从属性文件读取参数值并返回Myclass目的 我需要帮助来测试ReadPropertyFile方法与JUnit 如果可能的话使用模拟文件
  • 在内存中使用 byte[] 创建 zip 文件。 Zip 文件总是损坏

    我创建的 zip 文件有问题 我正在使用 Java 7 我尝试从字节数组创建一个 zip 文件 其中包含两个或多个 Excel 文件 应用程序始终完成 没有任何异常 所以 我以为一切都好 当我尝试打开 zip 文件后 Windows 7 出
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 检测并缩短字符串中的所有网址

    假设我有一条字符串消息 您应该将 file zip 上传到http google com extremelylonglink zip http google com extremelylonglink zip not https stack
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • 在 junit 测试中获取 javax.lang.model.element.Element 类

    我想测试我的实用程序类 ElementUtils 但我不知道如何将类作为元素获取 在 AnnotationProcessors 中 我使用以下代码获取元素 Set
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • 获取文件的总大小(以字节为单位)[重复]

    这个问题在这里已经有答案了 可能的重复 java 高效获取文件大小 https stackoverflow com questions 116574 java get file size efficiently 我有一个名为 filenam
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • 使用 CXF-RS 组件时,为什么我们使用 而不是普通的

    作为后续这个问题 https stackoverflow com questions 20598199 对于如何正确使用CXF RS组件我还是有点困惑 我很困惑为什么我们需要

随机推荐

  • 在重定向之前设置 cookie

    我试图在标头重定向之前设置 cookie 但它不起作用 我读过在标头重定向行之后设置 cookie 应该可以解决问题 但我没有运气 同样 之前的一篇文章建议 如果您在位置重定向中使用 人类 URL 则应该在 cookie 的路径参数中使用
  • 在 Interface Builder 中将文本标记为不需要翻译

    我在 Interface Builder 中使用虚拟文本 这是一个例子 The MYNAME不是真正的界面文本 它是以编程方式设置的viewDidLoad 我可以用特殊方式标记它 以便默认将其从我的翻译文件中排除吗 如果您正在使用ibtoo
  • Capistrano 使用 sudo 甚至使用“set :use_sudo, false”

    我不希望使用 sudo 通过 Capistrano 执行任何远程命令 具体来说 当我跑步时cap deploy setup 第一次时要求我输入 sudo 密码mkdir命令 我添加了set use sudo false到我的deploy r
  • SqlCipher Mingw/msys 问题

    我有一个问题 我无法编译 SqlCipher 我正在用这个http groups google com group sqlcipher browse thread thread 55c6296b56bf4533 c792bbec6df7d4
  • 如何在jquery中引用JSF组件Id? [复制]

    这个问题在这里已经有答案了 我如何在 jquery 中引用 JSF 组件 因为我不知道要引用的组件 id 前面的 id 你可以付出一切NamingContainer http download oracle com javaee 6 api
  • Prometheus-如何监控其他docker容器

    我想用普罗米修斯监控我的docker容器 我可以跑普罗米修斯 with Grafana但我不知道如何指示它监视其他 docker 容器 如果可能的话我想看一些例子 例如我有Ubuntu在我的主机上运行的容器以及Gentoo容器 我如何告诉
  • 中间件应该总是调用下一个?

    我一直在尝试了解 ASP NET 5 管道中间件的真正工作原理 据我所知 中间件只是一个Func
  • 允许对 C++11 中的循环进行编译器优化

    是否允许符合 C 11 的编译器优化 转换此代码 bool x true not an atomic type but suppose bool can be read written atomically while x spins un
  • 用鼠标移动 QGraphicsRectItem

    将 QGraphicsRectItem 添加到场景后 我试图移动它 它会移动 但与鼠标指针有一定的偏移 我认为这只是将鼠标指针位置添加到其原始位置 我不知道如何解决这个问题 这是我的代码 class ucFilter public QGra
  • 覆盖 Python Tkinter 中的默认选项卡行为

    我正在使用 Tkinter 用 Python 编写一个应用程序来管理我的 GUI 有一个文本输入框 我试图在其中实现自动完成功能 该功能将绑定到 Tab 键 我已将 Tab 键绑定到输入框 但是当我按 Tab 时 程序会尝试在 GUI 元素
  • 本例中 Canvas.Context Save 和 Restore 的目的是什么?

    这一页 http www authorcode com text animation in html5 在 HTML5 画布中显示一些动画 如果你看一下滚动条的来源 http www authorcode com scrolling tex
  • Canvas lineTo() 在错误的位置绘制 y 坐标

    我正在尝试使用 ctx lineTo 在画布上绘制一些矩形 它们被绘制 但 y 坐标永远不正确 矩形变得太高并且位于 y 轴上的错误位置 当我使用调试器单步执行时 它显示 lineTo 方法中的 y 坐标是正确的 但我创建了一个 canva
  • 将 IQueryable 对象转换为另一个对象?

    我不知道关键字是什么 所以这里是我想要的示例 return from i in userRepo GetUsers select new SimpleUser i UserId i Name userRepo GetUsers 返回类型IQ
  • 如何从 python 源代码中删除注释和文档字符串? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一个程序可以像这样运行 py2py py lt orig py gt smaller py 其中
  • Java 多维数组被视为基元或对象

    Is int matrix new int 10 10 一个原语还是一个对象 当我将它作为参数发送给函数时 它是否发送其引用 如对象 或其值 如基元 每个 Java 数组都是一个对象 当您将其作为参数传递时 您将传递该数组的引用的副本
  • 使用 jQuery 进行 Xml 调用(无效的 XML)

    我有一个问题 我想使用 jQuery 从 XML 文件中获取一些数据 如果我可以说它是 XML 文件 这是我的 jQuery 它适用于普通的 XML 文件 ajax type GET url test xml dataType xml su
  • PHP“Session_regenerate_id”和用户身份验证

    我正在我的网站上创建一个登录功能 并且正在考虑在每个页面上重新生成会话 ID 以使事情更加安全 我已阅读 PHP s 有关 regenerate id 的信息 但 PHP 页面上的帖子与他们提供的有关 session regenerate
  • TransformerConfigurationException:无法设置 Transformer 的功能

    我在设置 TransformerFactory 的功能时遇到以下错误 javax xml transform TransformerConfigurationException Cannot set the feature http apa
  • 连锁回调的最佳方式?

    我有一个关于在回调之间传递数据时将回调链接在一起的最佳方法的问题 我下面有一个示例 它可以工作 但有一个缺陷 即函数必须了解链并知道它们的位置 是否传递回调 function first data cb1 cb2 cb3 console l
  • 如何使用 SourceProvider 根据条件启用和禁用菜单项 (eclipse rcp Indigo 3.7)

    我有一个 eclipse rcp 版本 Indigo 3 7 应用程序 eclipse 插件项目 我阅读了 Lars Vogel 的教程 Eclipse Commands Advanced 修订版 0 2 2 1 2009 年 4 月 11