Eclipse RCP菜单和操作:配置还是编码?

pau*_*aul 12 plugin.xml eclipse-rcp eclipse-rap

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

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

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

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

我想我可以在几分钟内完成整个编码,但我不确定这是否符合日食的"精神".

有什么意见吗?应用程序将变得相当大,所以我想从一开始就采用这种方法.也许有人可以给我一个配置嵌套菜单的例子:-)

And*_* B. 25

我的观点是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>
Run Code Online (Sandbox Code Playgroud)

要激活/取消激活菜单,必须使用Core Expressions来启用/禁用命令处理程序.如果命令没有附加任何活动处理程序,它将被禁用.因此,也将禁用调用该命令的菜单项.

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

在工具栏中创建按钮(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>
Run Code Online (Sandbox Code Playgroud)

创建命令(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> 
Run Code Online (Sandbox Code Playgroud)

创建命令处理程序(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> 
Run Code Online (Sandbox Code Playgroud)

为命令创建状态变量(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>
Run Code Online (Sandbox Code Playgroud)

实现更改变量状态的类:

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

有关如何实现这些功能的更多详细信息,请访问以下位置: