2014-03-12 100 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會出現很奇怪,但來源是從我的提取公司插件

希望能幫助...

相關問題