2014-03-12 153 views
1

我建立一个Eclipse RCP应用程序,我有一个问题:Eclipse RCP的菜单

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

Menu A 
subMenu A1 
subMenu A2 

我要的是要告诉日食,只有当光标鼠标悬停在主菜单项,即菜单答:我该怎么做才能评估是否子菜单必须是可见这个?

在此先感谢

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

其Eclipse版本是您使用? – Calon

+0

Eclipse Indigo v 3.7.2 – user1310305

+0

当鼠标指针悬停在菜单项上时(如果此菜单项是子菜单的父项),所有子菜单都会自动打开。右键点击** Navigator或Package view **,然后将鼠标指针悬停在** New **菜单项上,您将会看到菜单项不同的子菜单,如** Project .. **,** Example .. ** ,**其他.. **等将鼠标指针移至其他菜单项时,该子菜单将消失。为了清楚地理解你的问题,添加屏幕截图(你可以在这里上传屏幕截图http://postimg.org并分享链接) –

回答

0

我怀疑,你可以得到这个使用plugin.xmlvisiblewhen运行。 由于您知道您要收听的MenuItem,因此您可以改为添加ArmListener。 它会监听MenuItem,并且你可以在里面实现visibleWhen命令或者调用其他一些触发你的Items的方法。

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 Snippet

编辑发现:一个弹出菜单中,你可以做

final Menu tableMenu = new Menu(shell, SWT.POP_UP); 
MenuItem item = new MenuItem(tableMenu, SWT.PUSH); 
item.setText("Hover Me"); 
item.addArmListener(armListener); 
+0

我想要听的菜单是视图中的上下文(弹出)菜单,它只会在用户做出正确的选择时出现,所以我不能按照你的建议来得到它 – user1310305

+0

为什么不呢?编辑答案。 – Calon

0

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

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

链接到动态元素的类扩展​​并以更新sourceProvider变量状态覆盖getContributionItems()方法......这里是招不是真的干净我的脑海里,但它的工作原理...

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

plugin.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根据时间屏蔽的菜单......

注:一些IDS会出现很奇怪,但来源是从我的提取公司插件

希望能帮助...

相关问题