当前位置: 首页 > 知识库问答 >
问题:

Eclipse RCP菜单

司空叶五
2023-03-14

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

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

Menu A
 subMenu A1
 subMenu A2

我想告诉eclipse,只有当光标鼠标悬停在主菜单项(即菜单A)上时,子菜单是否必须可见。我该怎么做?

提前感谢

<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>

共有2个答案

邓阳炎
2023-03-14

我过去做过类似的事情,但不确定这个技巧是否符合Eclipse的最新水平;我在菜单声明中使用了一个动态元素,并在org.eclipse.ui.services扩展点使用了一个源提供者

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

链接到动态元素的类扩展了CompoundContributionItem,并重写了getContributionItems()方法,以更新sourceProvider变量状态。。。这是一个对我来说不是很清楚但很有效的技巧。。。

@Override
protected IContributionItem[] getContributionItems() {
    SourceProvider.getInstance().updateState();
    return new IContributionItem[0];
}

SourceProvider示例:

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() {}
}

插件。xml:

   <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项根据时间被屏蔽。。。

注意:有些id可能看起来很奇怪,但来源是从我的公司插件中提取的

希望这能帮助。。。

屠锦
2023-03-14

我怀疑你能用插件运行它。xml和在时可见。因为您知道要听的菜单项,所以可以添加一个ArmListener。它将侦听MenuItem,您可以在其中执行visibleWhen命令,或调用触发项目的其他方法。

    ArmListener armListener = new ArmListener() {
    @Override
    public void widgetArmed(ArmEvent e) {
        System.out.println(e);
    }
    };

并称之为:

Menu systemMenu = display.getSystemMenu();
    if (systemMenu != null) {
        MenuItem sysItem = getItem(systemMenu, SWT.ID_QUIT);
        sysItem.addArmListener(armListener);
    }

如果可以在此SWT代码段中找到用法,则提供完整示例

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

final Menu tableMenu = new Menu(shell, SWT.POP_UP);
MenuItem item = new MenuItem(tableMenu, SWT.PUSH);
item.setText("Hover Me");
item.addArmListener(armListener);
 类似资料:
  • 菜单管理器允许为您的网站创建自定义菜单,并允许通过您的网站导航。 Step (1) - 在Joomla管理员中单击Menus → Menu Manager ,您将看到以下屏幕 - 您可以看到菜单和菜单项指向网站上的逻辑页面。 Step (2) - 要在您的网站上添加新菜单,请转到Menus → Menu Manager → Add New Menu ,如以下屏幕所示 - 单击“ Add New M

  • <div class="ui-actionsheet show"> <div class="ui-actionsheet-cnt am-actionsheet-down"> <h4>同时会将我从对方的列表中删除</h4> <button>分享</button> <button class="ui-actionsheet-del">删除

  • 本文介绍:菜单 创建应用程序菜单和上下文菜单 进程: 主进程​ new Menu() 用途:创建新菜单 静态方法 Menu.setApplicationMenu(menu) 用途:设置应用菜单(在macOS中为应用菜单,Windows 和 Linux中为窗口顶部菜单) menu Menu 注意: 这个API必须置于 app 模块的 ready之后. Menu.getApplicationMenu(

  • 读取(查询)已设置菜单 $list = $app->menu->list(); 获取当前菜单 $current = $app->menu->current(); 添加菜单 添加普通菜单 $buttons = [ [ "type" => "click", "name" => "今日歌曲", "key" => "V1001_TODAY_MU

  • jd.getMenuButtonBoundingClientRect() 获取菜单按钮(右上角胶囊按钮)的布局位置信息。 返回值 Object 菜单按钮的布局位置信息 参数 类型 说明 width number 宽度,单位:px height number 高度,单位:px top number 上边界坐标,单位:px right number 右边界坐标,单位:px bottom number

  • 我使用BottomNavigationViewEx库在我的android应用程序中显示底部菜单栏,该库运行良好并修复了标准BottomNavigationView的许多缺点。 问题是,根据要求,我需要在菜单中显示7个选项,其中4个选项是对各自功能的直接访问,还有一个“更多”选项,该选项应该显示一个包含3个以上选项的子菜单(类似于一个工具栏,其中包含属性为showAsAction=“never”的项

  • Eclipse 查看的菜单栏通常包含以下几个菜单: File 菜单 Edit 菜单 Navigate 菜单 Search 菜单 Project 菜单 Run 菜单 Window 菜单 Help 菜单 通过 Eclipse 插件你可以添加新的菜单和菜单项。 菜单描述 菜单名 描述 File File 菜单运行你打开文件,关闭编辑器,保存编辑的内容,重命名文件。 此外还可以导入和导出工作区的内容及关闭