首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Eclipse RCP菜单

Eclipse RCP菜单
EN

Stack Overflow用户
提问于 2014-03-12 23:07:33
回答 2查看 1K关注 0票数 1

我正在构建一个eclipse RCP应用程序,我有一个问题:

在plugin.xml文件中,我声明了一个包含5个命令的菜单。总之,它是这样的:

代码语言:javascript
复制
Menu A
 subMenu A1
 subMenu A2

我想要的是告诉eclipse来评估子菜单是否必须只有在光标鼠标悬停在主菜单项上时才可见,即菜单A。我该怎么做?

提前感谢

代码语言:javascript
复制
<extension
         point="org.eclipse.ui.menus">
      <menuContribution
            allPopups="false"
            locationURI="popup:com.x.sat.ui.views.ProjectsView?after=com.x.sat.ui.commands.closeproject">
         <menu
               icon="icons/repository_rep.gif"
               id="com.x.sat.ui.sgc"
               label="Gestion de Configuration">
            <command
                  commandId="com.x.sat.sgc.ui.addProject"
                  label="Partager le projet"
                  style="push">
               <visibleWhen
                     checkEnabled="false">
                  <reference
                        definitionId="satProjetOrSatModelProjectSelected">
                  </reference>
               </visibleWhen>
            </command>
            <command
                  commandId="com.x.sat.sgc.ui.synchronize"
                  label="Synchroniser avec le dépôt ..."
                  style="push">
               <visibleWhen
                     checkEnabled="false">
                  <reference
                        definitionId="synchronizeObject">
                  </reference>
               </visibleWhen>
            </command>
            <command
                  commandId="com.x.sat.sgc.ui.browseRepository"
                  label="Parcourir le dépôt...."
                  style="push">
            </command>
            <command
                  commandId="com.x.sat.sgc.ui.compare"
                  label="Comparer..."
                  style="push">
            </command>
            <command
                  commandId="com.x.sat.sgc.ui.disconnect"
                  label="Déconnecter le projet ..."
                  style="push">
            </command>
         </menu>
      </menuContribution>
   </extension>
EN

回答 2

Stack Overflow用户

发布于 2014-03-13 19:08:38

我怀疑您是否可以使用plugin.xmlvisiblewhen来运行它。由于您知道要侦听的MenuItem,因此可以添加一个ArmListener。它将侦听MenuItem,您可以在内部实现visibleWhen命令,或者调用一些其他方法来触发您的项目。

代码语言:javascript
复制
    ArmListener armListener = new ArmListener() {
    @Override
    public void widgetArmed(ArmEvent e) {
        System.out.println(e);
    }
    };

并将其称为:

代码语言:javascript
复制
Menu systemMenu = display.getSystemMenu();
    if (systemMenu != null) {
        MenuItem sysItem = getItem(systemMenu, SWT.ID_QUIT);
        sysItem.addArmListener(armListener);
    }

在此SWT Snippet中可以找到用法的完整示例

编辑:对于弹出菜单,您可以执行以下操作

代码语言:javascript
复制
final Menu tableMenu = new Menu(shell, SWT.POP_UP);
MenuItem item = new MenuItem(tableMenu, SWT.PUSH);
item.setText("Hover Me");
item.addArmListener(armListener);
票数 0
EN

Stack Overflow用户

发布于 2014-03-14 23:59:09

我在过去做过类似的事情,但不确定它是否符合Eclipse的最新技术;我在菜单声明中使用了一个dynamic元素,并从org.eclipse.ui.services扩展点使用了一个sourceProvider

我想它也应该适用于你的弹出菜单。

链接到动态元素的类扩展CompoundContributionItem并覆盖getContributionItems()方法,以便更新sourceProvider变量状态...这里有一个诀窍,虽然我的头脑不是很清楚,但它确实有效。

代码语言:javascript
复制
@Override
protected IContributionItem[] getContributionItems() {
    SourceProvider.getInstance().updateState();
    return new IContributionItem[0];
}

SourceProvider示例:

代码语言:javascript
复制
public class SourceProvider extends AbstractSourceProvider {

    private static String ID = "fr.jln.stackoverflow.services.SourceProvider";
    private static String VAR = "fr.jln.stackoverflow.variable1";

    private static final String VAL_TRUE = "TRUE";
    private static final String VAL_FALSE = "FALSE";

    public static SourceProvider getInstance() {
        ISourceProviderService ser = (ISourceProviderService) PlatformUI.getWorkbench().getService(ISourceProviderService.class);
        return (SourceProvider) ser.getSourceProvider(ID);
    }

    boolean state = false;

    public SourceProvider() {}

    @Override
    public Map<?, ?> getCurrentState() {
        String value = null;
        Map<String, String> map = new HashMap<String, String>(1);

        // fake variable (my id)
        map.put(ID, VAL_TRUE);

        // var state
        value = state ? VAL_TRUE : VAL_FALSE;
        map.put(VAR, value);

        return map;
    }

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

    public void updateState() {
        Calendar cal = Calendar.getInstance();
        int min = cal.get(Calendar.MINUTE);
        state = (min % 2 == 0);
        fireSourceChanged(ISources.WORKBENCH, VAR, state?VAL_TRUE:VAL_FALSE);
    }

    @Override
    public void dispose() {}
}

plugin.xml:

代码语言:javascript
复制
   <extension
         point="org.eclipse.ui.menus">
      <menuContribution
            allPopups="false"
            locationURI="menu:org.eclipse.ui.main.menu?after=additions">
         <menu
               label="StackOverflow">
            <command
                  commandId="fr.jln.stackoverflow.command1"
                  label="Command 1"
                  style="push">
               <visibleWhen
                     checkEnabled="false">
                  <with
                        variable="fr.jln.stackoverflow.variable1">
                     <equals
                           value="TRUE">
                     </equals>
                  </with>
               </visibleWhen>
            </command>
            <command
                  commandId="fr.jln.stackoverflow.command2"
                  label="Command 2"
                  style="push">
               <visibleWhen
                     checkEnabled="false">
                  <with
                        variable="fr.jln.stackoverflow.variable1">
                     <equals
                           value="FALSE">
                     </equals>
                  </with>
               </visibleWhen>
            </command>
            <dynamic
                  class="ContributionItem"
                  id="fr.jln.stackoverflow.dynamic1">
            </dynamic>
         </menu>
      </menuContribution>
   </extension>
   <extension
         point="org.eclipse.ui.services">
      <sourceProvider
            provider="SourceProvider">
         <variable
               name="fr.jln.stackoverflow.variable1"
               priorityLevel="workbench">
         </variable>
      </sourceProvider>
   </extension>

对于这个示例,在结果中您应该有一个包含2项的菜单,其中1项根据时间而被屏蔽。

注意:一些ids可能看起来很奇怪,但源代码是从我的公司插件中提取出来的

希望这能有所帮助..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22355660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档