gpt4 book ai didi

eclipse-rcp - Eclipse RCP 菜单和操作 : Configure or code?

转载 作者:行者123 更新时间:2023-12-03 17:49:56 24 4
gpt4 key购买 nike

这是一个普遍的问题,但我当前的问题围绕菜单处理。

在具有贡献菜单操作的普通插件中,您将在 plugin.xml 配置中配置 ActionSets 等。这显然是明智的。

我正在开发一个 RCP 应用程序(实际上是 RAP),我想知道是否值得通过 plugin.xml 配置所有内容。我的插件不必与其他未知插件交互,因此理论上,我可以控制。我可以以编程方式添加菜单和操作。

我一直在尝试配置一个包含子菜单的菜单。我曾尝试定义 ActionSet 并将其中一个链接到另一个中,但没有成功。根据用户角色,需要禁用某些项目。

我想我可以在几分钟内完成全部编码,但我不确定这是否符合 eclipse 的“精神”。

外面有什么意见?应用程序会变得相当大,所以我想从一开始就采用正确的方法。也许有人可以给我指出一个配置嵌套菜单的例子:-)

最佳答案

我的观点是 plugin.xml 实现是要走的路。

我使用这种方法的主要原因有两个:

  • 无需编写java代码即可重新配置和重新组织菜单和按钮,这真的很容易。
  • 非常清晰的菜单树分层可视化。

  • 这是一个实现菜单和子菜单的代码片段。在本例中,它们被添加到主菜单中。

    您可以将其粘贴到您的 plugin.xml 中:

    <extension
    name="Main Menu Contributions"
    point="org.eclipse.ui.menus">
    <menuContribution
    allPopups="false"
    locationURI="menu:org.eclipse.ui.main.menu">
    <menu
    id="fileMenu"
    label="File">
    <command
    commandId="org.eclipse.ui.file.exit"
    label="Exit"
    style="push">
    </command>
    </menu>
    <menu
    label="Edit">
    <command
    commandId="org.eclipse.ui.edit.selectAll"
    label="Select All"
    style="push">
    </command>
    <menu
    label="Submenu">
    <command
    commandId="org.eclipse.ui.edit.selectAll"
    label="Select All Submenu"
    style="push">
    </command>
    <command
    commandId="org.eclipse.ui.edit.delete"
    label="Delete submenu"
    style="push">
    </command>
    </menu>
    </menu>
    </menuContribution>
    </extension>

    要激活/停用菜单,您必须使用核心表达式来启用/禁用命令处理程序。如果命令没有附加任何事件处理程序,它将被禁用。因此,调用该命令的菜单项也将被禁用。

    以下代码片段显示了如何在 View 的工具栏上创建按钮并根据变量的值启用/禁用它。请记住,您必须更改此代码中的某些内容才能使其正常工作。大多数更改是针对引用名称和类实现的。

    在工具栏中创建按钮(plugin.xml):

       <extension
    name="View Toolbar Contributions"
    point="org.eclipse.ui.menus">
    <menuContribution
    allPopups="false"
    locationURI="toolbar:myapp.views.MyView">
    <command
    commandId="myapp.commands.PauseSound"
    icon=""
    label="Pause Playback Sound"
    style="push"
    tooltip="Pause">
    </command>
    </menuContribution>
    </extension>

    创建命令(plugin.xml):

    <extension
    id="myapp.commands.PauseSound"
    name="Pause sound command"
    point="org.eclipse.ui.commands">
    <command
    id="myapp.commands.PauseSound"
    name="Pause Sound">
    </command>
    </extension>

    创建命令处理程序 (plugin.xml):

    <extension
    point="org.eclipse.ui.handlers">
    <handler
    commandId="myapp.commands.PauseSound">
    <activeWhen>
    <with
    variable="myapp.commands.sourceprovider.active">
    <or>
    <equals
    value="PLAYING">
    </equals>
    <equals
    value="PAUSED">
    </equals>
    </or>
    </with>
    </activeWhen>
    <class
    class="myapp.rcp.commands.toolbar.PausePlayback">
    </class>
    </handler>
    </extension>

    为命令创建状态变量 (plugin.xml):

       <extension
    point="org.eclipse.ui.services">
    <sourceProvider
    provider="myapp.commands.sourceprovider.CommandState">
    <variable
    name="myapp.commands.sourceprovider.active"
    priorityLevel="workbench">
    </variable>
    </sourceProvider>
    </extension>

    实现改变变量状态的类:

    public class CommandState extends AbstractSourceProvider {
    public final static String STATE = "myapp.commands.sourceprovider.active";
    public final static String STOPPED = "STOPPED";
    public final static String PLAYING = "PLAYING";
    public final static String PAUSED = "PAUSED";
    public final static String NOT_LOADED = "NOT_LOADED";

    enum State {
    NOT_LOADED, PLAYING, PAUSED, STOPPED
    };
    private State curState = State.NOT_LOADED;

    @Override
    public void dispose() {
    }

    @Override
    public String[] getProvidedSourceNames() {
    return new String[] { STATE };
    }

    // You cannot return NULL
    @SuppressWarnings("unchecked")
    @Override
    public Map getCurrentState() {
    Map map = new HashMap(1);
    if (curState == State.PLAYING)
    map.put(STATE, PLAYING);
    else if (curState == State.STOPPED)
    map.put(STATE, STOPPED);
    else if (curState == State.PAUSED)
    map.put(STATE, PAUSED);

    return map;
    }

    public void setPlaying() {
    fireSourceChanged(ISources.WORKBENCH, STATE, PLAYING);
    }

    public void setPaused() {
    fireSourceChanged(ISources.WORKBENCH, STATE, PAUSED);
    }

    public void setStopped() {
    fireSourceChanged(ISources.WORKBENCH, STATE, STOPPED);
    }

    public void setNotLoaded() {
    fireSourceChanged(ISources.WORKBENCH, STATE, NOT_LOADED);
    }

    }

    可以在以下位置找到有关如何实现这些功能的更多详细信息:
  • Eclipse Commands Tutorial
  • Limiting Visibility of Commands
  • 关于eclipse-rcp - Eclipse RCP 菜单和操作 : Configure or code?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4737274/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com