2013-04-12 42 views
0

我在我的ecp應用程序中有一個視圖部分,它只包含一個TreeViewereclipse rcp:如何將選擇傳遞給處理程序

每個樹節點具有一個動作提供商當節點是正確的點擊,這將有助於在上下文菜單:

MenuManager menuManager = new MenuManager(); 
     menuManager.addMenuListener(new IMenuListener(){ 

      @Override 
      public void menuAboutToShow(IMenuManager manager) { 
       IStructuredSelection is = (IStructuredSelection)treeViewer.getSelection(); 
       if(is.isEmpty()){ 
        return; 
       }else{ 
        Node node = (Node)is.getFirstElement(); 
        IActionProvider provider = node.getActionProvider(); 
        IContributionItem[] actions = provider.getActions(); 
        if(actions.length == 0){ 
         return; 
        }else{ 
         for(IContributionItem action : actions){ 
          manager.add(action); 
         } 
        } 
       } 
      } 

     }); 
     Menu menu = menuManager.createContextMenu(treeViewer.getTree()); 
     menuManager.setRemoveAllWhenShown(true); 
     treeViewer.getTree().setMenu(menu); 
     getSite().registerContextMenu(menuManager, treeViewer); 
     getSite().setSelectionProvider(treeViewer); 

一個動作提供商例如:

public class CPSActionProvider implements IActionProvider { 
    private Object source; 

    @Override 
    public void setInitializationData(IConfigurationElement config, 
      String propertyName, Object data) throws CoreException { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public IContributionItem[] getActions() { 
     CommandContributionItemParameter cp = new CommandContributionItemParameter(
       PlatformUI.getWorkbench().getActiveWorkbenchWindow(), 
       null, "cn.ggfan.dmp.commands.addCP", 
       CommandContributionItem.STYLE_CHECK); 
     HashMap<String, Object> paras = new HashMap<String, Object>(); 
     paras.put("source", this.source); 
     cp.parameters = paras; 
     CommandContributionItem add = new CommandContributionItem(cp); 
     //add.setId("cn.ggfan.dmp.commands.addCP"); 
     return new IContributionItem[] { add }; 
    } 

    @Override 
    public void setSource(Object o) { 
     // TODO Auto-generated method stub 
     this.source = o; 
    } 

} 

cn.ggfan.dmp.commands.addCP是定義的命令,該命令有一個defaultHandler,源字段是右鍵單擊節點,現在我的問題是如何將源字段傳遞到處理程序?正如你所看到的,我試圖做這樣的:

HashMap<String, Object> paras = new HashMap<String, Object>(); 
     paras.put("source", this.source); 
     cp.parameters = paras; 

但簡化版,它的工作。

回答

2
  1. 您需要將Tree/Table ViewerSelectionProvider設置爲PartSite

IWorkbenchSite.java

public void setSelectionProvider(ISelectionProvider provider); 
  1. 您的命令處理程序代碼,您將擁有以下方法

公共對象執行(ExecutionEvent事件),則拋出ExecutionException

使用ISelection selection = HandlerUtil.getCurrentSelectionChecked(event);

//////////////////////////////////////////////// ////////////////

如果不提供工作臺,還有另一種方法SourceProvider。你可以實現你自己的

org.eclipse.ui.ISourceProvider 

它的責任是更新提供者地圖。這裏是示例參考

http://www.vogella.com/articles/EclipseCommandsAdvanced/article.html

+0

我知道這種方法,我只是在尋找更好的方法。 – CaiNiaoCoder

+0

更新了我的答案。我只是想通過更好的方式來理解你的意思! –

相關問題