2013-02-09 60 views
1

我想做一個Eclipse插件,它能夠根據其他插件使用第一個插件提供的擴展點動態更改導航視圖的上下文菜單。如何爲Eclipse插件製作動態上下文菜單?

隨着一點點的原理:http://hpics.li/bddf781

的目的是,通過插件提供的所有命令2,3 ...可以導航上下文菜單感謝訪問到插件1

我已經Google搜索,但我無法獲得任何工作。

例如:

package com.sigasi;

import java.util.Date; 

import org.eclipse.jface.action.ContributionItem; 
import org.eclipse.swt.SWT; 
import org.eclipse.swt.events.SelectionAdapter; 
import org.eclipse.swt.events.SelectionEvent; 
import org.eclipse.swt.widgets.Menu; 
import org.eclipse.swt.widgets.MenuItem; 


public class MyDynamicMenu extends ContributionItem { 

    public MyDynamicMenu() { 
    } 

    public MyDynamicMenu(String id) { 
    super(id); 
    } 

@Override 
public void fill(Menu menu, int index) { 
    //Here you could get selection and decide what to do 
    //You can also simply return if you do not want to show a menu 

    //create the menu item 
    MenuItem menuItem = new MenuItem(menu, SWT.CHECK, index); 
    menuItem.setText("My menu item (" + new Date() + ")"); 
    menuItem.addSelectionListener(new SelectionAdapter() { 
     public void widgetSelected(SelectionEvent e) { 
      //what to do when menu is subsequently selected. 
      System.err.println("Dynamic menu selected"); 
     } 
    }); 
} 
} 

有:

<extension point="org.eclipse.ui.menus"> 
<menuContribution locationURI="popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?after=additions"> 
    <dynamic 
       class="com.sigasi.MydynamicMenu" 
       id="com.sigasi.myDynamicMenu"> 
    </dynamic> 
    </menuContribution> 
</extension> 

來源:http://www.sigasi.com/content/dynamic-menu-items-eclipse

這可能是巨大的,如果它不只是一個項目添加到菜單。我試圖根據自己的需要調整它,但沒有成功。

編輯:我試圖改變那裏的java類的超類到CompoundContributionItem;它允許添加多個項目到菜單,但似乎取代現有的取決於索引,而不是簡單地添加它。而且,我仍然無法插入菜單。下面是我做的:

package fr.cardinjoseph.extensionpoint.definition; 

import java.util.HashMap; 
import java.util.Map; 

import org.eclipse.jface.action.ContributionItem; 
import org.eclipse.jface.action.IContributionItem; 
import org.eclipse.swt.SWT; 
import org.eclipse.swt.events.SelectionAdapter; 
import org.eclipse.swt.events.SelectionEvent; 
import org.eclipse.swt.widgets.Menu; 
import org.eclipse.swt.widgets.MenuItem; 
import org.eclipse.ui.IWorkbench; 
import org.eclipse.ui.IWorkbenchWindow; 
import org.eclipse.ui.PlatformUI; 
import org.eclipse.ui.actions.CompoundContributionItem; 
import org.eclipse.ui.menus.CommandContributionItem; 
import org.eclipse.ui.menus.CommandContributionItemParameter; 

public class MyDynamicMenu extends CompoundContributionItem { 

    ExtensionsFinder ef; 

    public MyDynamicMenu() { 
     ef = new ExtensionsFinder(); 
     ef.evaluateExtensions(); 
    } 

    public MyDynamicMenu(String id) { 
     super(id); 
    } 

    @Override 
    public void fill(Menu menu, int index) { 
     // Here you could get selection and decide what to do 
     // You can also simply return if you do not want to show a menu 

     // create the menu item 

      Menu commandMenu = new Menu(menu); 


     MenuItem test = new MenuItem(menu, index); test.setText("Test"); 
     test.addSelectionListener(new SelectionAdapter() { public void 
     widgetSelected(SelectionEvent e) { System.err.println("Dynamic menu selected"); } 
     }); 


    } 

    @Override 
    protected IContributionItem[] getContributionItems() { 
     // TODO Auto-generated method stub 
     int size = ef.getExtensions().size(); 
     IContributionItem[] list = new IContributionItem[size]; 

     IWorkbench wb = PlatformUI.getWorkbench(); 
     IWorkbenchWindow win = wb.getActiveWorkbenchWindow(); 

     for(int i = 0 ; i< size ; i++){ 
      list[i] = new CommandContributionItem(new CommandContributionItemParameter(win, "MenuCommandeId_"+i, "CommandeId_"+i, SWT.None)); 
     } 

     System.out.println("test"); 

     return list; 
    } 

    @Override 
    public boolean isDynamic(){ 
     return true; 
    } 

} 

回答

1

您可以添加多個菜單項是這樣的:

@Override 
    public void fill(Menu menu, int index) { 
     MenuItem menuItem = new MenuItem(menu, SWT.CHECK, index); 
     menuItem.setText("1. menu item (" + new Date() + ")"); 

     menuItem = new MenuItem(menu, SWT.CHECK, index); 
     menuItem.setText("2. menu item (" + new Date() + ")"); 

     menuItem = new MenuItem(menu, SWT.CHECK, index); 
     menuItem.setText("3. menu item (" + new Date() + ")"); 
    } 

或添加像這樣的級聯菜單:

@Override 
    public void fill(Menu menu, int index) { 
     Menu cascMenu = new Menu(menu); 
     MenuItem cascade = new MenuItem(cascMenu, SWT.CASCADE, index); 
     cascade.setText("Cascade..."); 
     cascade.setMenu(cascMenu); 

     MenuItem menuItem = new MenuItem(cascade, SWT.CHECK, index); 
     menuItem.setText("1. menu item (" + new Date() + ")"); 
     // etc. 
    } 
+0

級聯菜單項不起作用,對菜單項沒有構造函數接受「菜單項」作爲第一個參數.... – Xinus 2015-01-18 16:52:55

1

有展示的可能性/隱藏,使用enabledWhen/visibleWhen元素啓用/禁用菜單並實現您自己的property testerssource providers。例如,請參閱following tutorial

在這種情況下,您將創建所有菜單項並測試所需條件,以便顯示這些條目。事情是這樣的:

<extension point="org.eclipse.ui.menus"> 
<menuContribution allPopups="false" locationURI="menu:org.eclipse.ui.main.menu"> 
      <menu id="id" label="%label"> 
       <visibleWhen 
        checkEnabled="false"> 
        <with 
         variable="SomeProvider.var1"> 
        </with> 
       </visibleWhen> 
       <command commandId="command1" id="com1" label="%test" style="push"> 
       </command> 
      </menu> 
     </menuContribution> 
</extension> 

<extension 
     point="org.eclipse.ui.services"> 
     <sourceProvider 
      provider="com.your_package.SomeProvider"> 
     <variable 
       name="SomeProvider.var1" 
       priorityLevel="workbench"> 
     </variable> 
     </sourceProvider> 
</extension> 
public class SomeProvider extends AbstractSourceProvider { 
    private static final String VAR1 = "SomeProvider.var1"; 

    @Override 
    public Map getCurrentState() { 
     Map<String, String> stateMap = new HashMap<String, String>(); 
       stateMap.put(VAR1, testIfMenuForVar1ShouldBeShown()); 
     return stateMap; 
    } 
}