2011-06-01 62 views
9

我需要一個Eclipse插件項目,以創建一個TreeViewer中的上下文菜單。但是,菜單不應該包含常量項目,它們應該根據所選節點的類型而有所不同。例如,我的TreeViewer中有以下層次:上下文菜單 - SWT

Node A 
| 
--Node B 
    | 
    --Node C 

對於節點A - 我想顯示有動作的菜單,但節點B和C,我不希望任何顯示(無菜單)。 我設法創建節點A的菜單,但後來選擇了一些其他類型的節點時,我無法擺脫它。我的代碼如下所示:

treeViewer.addSelectionChangedListener(
      new ISelectionChangedListener(){ 
       public void selectionChanged(SelectionChangedEvent event) { 
        if(event.getSelection() instanceof IStructuredSelection) { 
         IStructuredSelection selection = (IStructuredSelection)event.getSelection();    
         Object o = selection.getFirstElement();  

         MenuManager menuMgr = new MenuManager(); 

         if (o instanceof NodeA){ 

          Menu menu = menuMgr.createContextMenu(treeViewer.getControl()); 
          treeViewer.getControl().setMenu(menu); 
          getSite().registerContextMenu(menuMgr, treeViewer); 

          menuMgr.add(new SomeAction()); 

         }else { 
          //what ? 
         } 
        } 

       } 
      } 
    ); 

在else分支我試着打電話給dispose()removeAll()在MenuManager ...沒有什麼工作!

任何幫助表示讚賞,謝謝。

回答

7

只需使用單一的菜單管理。 請勿動態製作菜單管理器。

從理論上講,你可能試過了,但效率不高,不是一般的方法。

只需製作菜單管理器並添加所需的所有操作。

當選擇已被改變時,調用Action#setVisible(true | false)來隱藏或顯示菜單項。 您也可以使用行動#setEnable啓用/禁用菜單項。

ps。 菜單管理器不是菜單GUI(喜歡TreeViewer不是樹)

它爲Actions(業務邏輯)提供菜單(SWT)。它還管理可見性和啓用。我們稱之爲貢獻管理器。我們可以用這個創建一個SWT菜單。 (即使我們不知道SWT,我們只需要知道,只有我們的業務邏輯:動作),這是一個在JFace的基本思想。

當您將操作添加到manu管理器時,操作將使用ActionContributionItem包裝。它掛鉤動作的狀態更新UI(知名度,啓用菜單,按鈕,工具欄等)。它還會在UI按下時啓動操作。

如果您是eclipse的新手,很容易混淆SWT和JFace的角色。

+0

謝謝你的提示,現在我創建菜單一次,然後在選擇的情況下,我打電話action.setEnabled(假)。這工作正常,但我沒有找到一個Action的setVisible方法。我想在選擇其他節點而不是灰色時隱藏它。謝謝 – AndaP 2011-06-02 17:28:08

+1

如果您添加包含您的操作的ActionContributionItems,它們有一個'setVisible(boolean)'方法。但是你應該選擇'setRemoveAllWhenShown(*)'或更新'ActionContributionItems'的可見性,因爲它們是不同的方法。 – 2011-06-03 01:56:10

11

正如@jeeeyul提到的,您應該只創建一個MenuManager以在您的視圖中使用。

您可以使用新建>插件項目和視圖模板來獲取視圖中使用查看器的上下文菜單示例,但基本上在您的createPartControl(Composite)方法中,您可以連接上下文管理器。

MenuManager menuMgr = new MenuManager(); 
    menuMgr.setRemoveAllWhenShown(true); 
    menuMgr.addMenuListener(new IMenuListener() { 
     public void menuAboutToShow(IMenuManager manager) { 
      SampleView.this.fillContextMenu(manager); 
     } 
    }); 
    Menu menu = menuMgr.createContextMenu(viewer.getControl()); 
    viewer.getControl().setMenu(menu); 
    getSite().registerContextMenu(menuMgr, viewer); 

fillContextMenu(MenuManager)方法將有機會獲得您的瀏覽器,這樣你就可以從當前的選擇。您可以添加任何您想要的操作,甚至在用當前選擇更新操作後重新添加操作。

registerContextMenu(*)調用允許像org.eclipse.ui.popupMenus和org.eclipse.ui.menus擴展點,有助於項目的上下文菜單。

+0

是的,我現在正在使用這種方法。在我的其他觀點中,我只是這樣創建它的。但我真正擔心的是如何更改菜單的內容。 – AndaP 2011-06-02 17:29:23

+0

每個菜單SWT.Show事件都會調用fillContextMenu(*)。您可以每次在該方法中更改菜單的內容。 – 2011-06-03 01:53:56

6

這就是我的方式做到這一點:

MenuManager menuMgr = new MenuManager(); 

     Menu menu = menuMgr.createContextMenu(viewer.getControl()); 
     menuMgr.addMenuListener(new IMenuListener() { 
      @Override 
      public void menuAboutToShow(IMenuManager manager) { 
       // IWorkbench wb = PlatformUI.getWorkbench(); 
       // IWorkbenchWindow win = wb.getActiveWorkbenchWindow(); 
       if (viewer.getSelection().isEmpty()) { 
        return; 
       } 

       if (viewer.getSelection() instanceof IStructuredSelection) { 
        IStructuredSelection selection = (IStructuredSelection) viewer.getSelection(); 
        Node object = (Node)selection.getFirstElement(); 

        if (object.getModel() instanceof NodeA) { 
         manager.add(new Action(); 
        } else if (object.getModel() instanceof NodeB) { 

         manager.add(new OtherAction()); 

        } 
       } 
      } 
     }); 
     menuMgr.setRemoveAllWhenShown(true); 
     viewer.getControl().setMenu(menu); 

我希望這有助於;)

菜單經理屬性設置removeAllWhenShown爲false,以隱藏所有其他很重要節點行動;)

0

假設你知道如何創建行動,你只有下面的例子爲我工作希望這一串代碼將幫助您

感興趣的上下文菜單
private void hookContextMenu() { 
    MenuManager contextMenu = new MenuManager(); 
    contextMenu.setRemoveAllWhenShown(true); 
    contextMenu.addMenuListener(new IMenuListener() { 

     @Override 
     public void menuAboutToShow(IMenuManager manager) { 



      IStructuredSelection sSelection = (IStructuredSelection) treeViewer.getSelection(); 

      } 
      if(selectedObject instanceof A){ 
      manager.add(action); 
      } 

     } 
    });