2014-03-07 31 views
3

我正在嘗試在eclipse中創建一個插件,它在包瀏覽器中右鍵單擊某個文件或文件夾時添加了一個菜單項。該菜單項包含某些必須動態加載的命令(所以我不能在plugin.xml中對它們進行硬編碼)。這些命令實際上是在另一個擴展中,它通過我提供的擴展點附加到我的插件上。Eclipse插件:用命令和相應的處理程序動態填充菜單

我現在正在做的是創建菜單項,使用附加到我的擴展點的所有命令填充它,並將ButtonListener添加到它們全部。一切都這樣工作,但有一個問題。我需要的信息上在Package Explorer用戶右鍵點擊(是它的的IFile或的iFolder項目?)和項目,從我的研究,我需要做的是,在處理類似如下:

public Object execute(ExecutionEvent event) throws ExecutionException { 

    ISelection currentSelection = HandlerUtil.getCurrentSelection(event); 
    TreeSelection treeSelection = (TreeSelection) currentSelection; 
    Object firstElement = treeSelection.getFirstElement(); 

    ActionMenu.setNode(firstElement); 

    return null; 
} 

其中,Action菜單是表示菜單項的實際類,負責填充它。不幸的是,該代碼現在在我的插件中不會被調用。

我的問題是:

我如何才能創建動態每個命令的處理程序執行()函數被調用?或者在我的ActionMenu類中有更好的方法來獲取用戶右鍵點擊的選擇(知道它是一個IFolder還是IFile)?

下面是我的ActionMenu類(fill()函數中的相關代碼,它將每個命令添加爲子菜單項和ButtonListener嵌套類)。 ICommand的是命令必須在其他擴展實現接口:

... 

public final void fill(final Menu menu, final 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 

    List<ICommand> commands = new ArrayList<ICommand>(); 
    IConfigurationElement[] contributions = Platform.getExtensionRegistry().getConfigurationElementsFor(Extension_Point_ID); 

    try { 
     for (IConfigurationElement e : contributions) { 
      final Object o = 
       e.createExecutableExtension("class"); 
      commands.add((ICommand) o); 
     } 
    } catch (CoreException ex) { 
     System.out.println(ex.getMessage()); 
    } 

    for (ICommand command : commands) 
    { 
     MenuItem menuItem = new MenuItem(menu, SWT.CHECK, index); 
     menuItem.setText(command.getName()); 
     menuItem.addSelectionListener(new ButtonListener(command)); 
    } 
} 

public class ButtonListener extends SelectionAdapter { 

    ICommand command_; 

    public ButtonListener(ICommand command) { 
     command_ = command; 
    } 

    @Override 
    public final void widgetSelected(final SelectionEvent e) { 

     if (node_ instanceof org.eclipse.core.resources.IFile) { 
      command_.executeFile(node_); 
     } 

     else if (node_ instanceof org.eclipse.core.resources.IFolder) { 
      command_.executeFolder(node_); 
     } 
    } 
} 

這裏是我的plugin.xml文件的內容:

<?xml version="1.0" encoding="UTF-8"?> 
<?eclipse version="3.4"?> 
<plugin> 
    <extension-point id="ca.polymtl.log8430.Command" name="Command" schema="schema/ca.polymtl.log8430.Command.exsd"/> 

<extension point="org.eclipse.ui.menus"> 
    <menuContribution locationURI="popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?after=additions"> 
    <menu 
     id="apply_command" 
     label="ApplyCommand"> 
    </menu> 
    </menuContribution> 

    <menuContribution locationURI="popup:apply_command?after=additions"> 
     <dynamic 
        class="ca.polymtl.log8430.popup.ActionMenu" 
        id="ca.polymtl.log8430.popup.actionMenu"> 
     </dynamic> 
    </menuContribution> 
</extension> 

<extension 
    point="org.eclipse.ui.handlers"> 
    <handler 
     class="ca.polymtl.log8430.Handler" 
     commandId="ca.polymtl.log8430.Command1"> 
    </handler> 
</extension> 
<extension 
    point="org.eclipse.ui.commands"> 
    <command 
     id="ca.polymtl.log8430.Command1" 
     name="Command_1"> 
    </command> 
</extension> 

</plugin> 

感謝您的幫助,如果你需要更多的細節,請不要猶豫,問。

回答

1

鑑於您設置菜單的方式,您不需要使用處理程序。你可以簡單地得到當前選擇在你的聽衆的widgetSelected方法:

IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); 

IStructuredSelection selection = (IStructuredSelection)page.getSelection(); 

注:實際的選擇可能不是直接實現IFileIFolder,所以你應該利用這個平臺適配器管理器,看看他們是否adapt到資源:

Object selObject = selection.getFirstElement(); 

IResource resource = (IResource)Platform.getAdapterManager().getAdapter(selObject, IResource.class); 

,然後測試resource,看它是否是一個IFileIFolder

+0

感謝您的建議!如果它是選定的文件或文件夾,我將如何檢查?該插件絕不會在widgetSelected()函數中輸入我的兩個if()語句。 – Choub890

+0

@ Choub890添加適配器管理器使用 –

+0

我在我的widgetSelected()函數中添加了IResource資源= ...行代碼,並且由於資源變量爲空,它仍然不會輸入我的if()語句。當我在包資源管理器中選擇文件或文件夾時會發生這種情況。 – Choub890

相關問題