Eclipse插件:如何获取当前所选项目的路径

我正在编写一个Eclipse插件,它将在Java项目的上下文菜单中显示一个菜单项。 我编写了plugin.xml,如下所示:

                  

所以我现在正在尝试编写扩展CompoundContributionItemMenuContribution类,以便我可以创建一个动态菜单,该菜单的内容将基于Java Project根目录中存在的一组文件。 但是我试图从getContributionItems方法中获取根目录的路径。

基于plugin.xml文件,我可以保证只有在选择单个Java项目时才会调用该方法,因此我需要做的就是获取当前选择,然后获取其绝对路径。 有任何想法吗? 或者有更好的方法吗?

这应该让你更接近(如果没有完全为你解决;))

  IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); if (window != null) { IStructuredSelection selection = (IStructuredSelection) window.getSelectionService().getSelection(); Object firstElement = selection.getFirstElement(); if (firstElement instanceof IAdaptable) { IProject project = (IProject)((IAdaptable)firstElement).getAdapter(IProject.class); IPath path = project.getFullPath(); System.out.println(path); } } 

自从我写了上一个回答后,我编写了另外两个实用程序插件,现在有了Eclipse Navigator Popups的通用启动器。 文件如下:

基本清单文件

MANIFEST.MF

 Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: NavigatorPopup Bundle-SymbolicName: com.nsd.NavigatorPopup;singleton:=true Bundle-Version: 1.0.0.1 Bundle-Vendor: NSD Require-Bundle: org.eclipse.ui, org.eclipse.core.resources, org.eclipse.core.runtime Bundle-RequiredExecutionEnvironment: JavaSE-1.6 

基本属性文件

build.properties

 source.. = src/ output.. = bin/ bin.includes = plugin.xml,\ META-INF/,\ . 

插件文件

特别注意扩展点中

如何链接到扩展点中,这允许我们将多个菜单贡献链接到单个处理程序。

另外值得注意的是,有多个locationURI ,因为它们可以从一个角度改变到另一个角度。

plugin.xml中

                        

要了解有关当前选择的插件的更多信息,请单击文件并使用ALT-SHIFT-F1作为插件选择间谍

插件选择间谍

使用ALT-SHIFT-F2作为插件菜单间谍。 注意在右键单击并选择感兴趣的弹出菜单项之前按ALT-SHIFT-F2组合。 插件菜单间谍

最后是插件的代码。

NavigatorPopupHandler.java

 package com.nsd.navigatorpopup; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.handlers.HandlerUtil; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ITreeSelection; import org.eclipse.jface.viewers.TreePath; import org.eclipse.jface.viewers.TreeSelection; // ==================================================================================================================== // This handler will obtain the core information about a file from a navigator popup menu // ==================================================================================================================== public class NavigatorPopupHandler extends AbstractHandler { private IWorkbenchWindow window; private IWorkbenchPage activePage; private IProject theProject; private IResource theResource; private IFile theFile; private String workspaceName; private String projectName; private String fileName; public NavigatorPopupHandler() { // Empty constructor } public Object execute(ExecutionEvent event) throws ExecutionException { // Get the project and file name from the initiating event if at all possible if(!extractProjectAndFileFromInitiatingEvent(event)) { return null; } // CODE THAT USES THE FILE GOES HERE MessageDialog.openInformation(this.window.getShell(), "NavigatorPopup", String.format("File Details.\n\nWorkspace=%s\nProject=%s\nFile=%s", workspaceName, projectName, fileName)); return null; } private boolean extractProjectAndFileFromInitiatingEvent(ExecutionEvent event) { // ============================================================================================================ // The execute method of the handler is invoked to handle the event. As we only contribute to Explorer // Navigator views we expect to get a selection tree event // ============================================================================================================ this.window = HandlerUtil.getActiveWorkbenchWindow(event); // Get the active WorkbenchPage this.activePage = this.window.getActivePage(); // Get the Selection from the active WorkbenchPage page ISelection selection = this.activePage.getSelection(); if(selection instanceof ITreeSelection) { TreeSelection treeSelection = (TreeSelection) selection; TreePath[] treePaths = treeSelection.getPaths(); TreePath treePath = treePaths[0]; // The TreePath contains a series of segments in our usage: // o The first segment is usually a project // o The last segment generally refers to the file // The first segment should be a IProject Object firstSegmentObj = treePath.getFirstSegment(); this.theProject = (IProject) ((IAdaptable) firstSegmentObj).getAdapter(IProject.class); if(this.theProject == null) { MessageDialog.openError(this.window.getShell(), "Navigator Popup", getClassHierarchyAsMsg( "Expected the first segment to be IAdapatable to an IProject.\nBut got the following class hierarchy instead.", "Make sure to directly select a file.", firstSegmentObj)); return false; } // The last segment should be an IResource Object lastSegmentObj = treePath.getLastSegment(); this.theResource = (IResource) ((IAdaptable) lastSegmentObj).getAdapter(IResource.class); if(this.theResource == null) { MessageDialog.openError(this.window.getShell(), "Navigator Popup", getClassHierarchyAsMsg( "Expected the last segment to be IAdapatable to an IResource.\nBut got the following class hierarchy instead.", "Make sure to directly select a file.", firstSegmentObj)); return false; } // As the last segment is an IResource we should be able to get an IFile reference from it this.theFile = (IFile) ((IAdaptable) lastSegmentObj).getAdapter(IFile.class); // Extract additional information from the IResource and IProject this.workspaceName = this.theResource.getWorkspace().getRoot().getLocation().toOSString(); this.projectName = this.theProject.getName(); this.fileName = this.theResource.getName(); return true; } else { String selectionClass = selection.getClass().getSimpleName(); MessageDialog.openError(this.window.getShell(), "Unexpected Selection Class", String.format("Expected a TreeSelection but got a %s instead.\nProcessing Terminated.", selectionClass)); } return false; } @SuppressWarnings("rawtypes") private static String getClassHierarchyAsMsg(String msgHeader, String msgTrailer, Object theObj) { String msg = msgHeader + "\n\n"; Class theClass = theObj.getClass(); while(theClass != null) { msg = msg + String.format("Class=%s\n", theClass.getName()); Class[] interfaces = theClass.getInterfaces(); for(Class theInterface : interfaces) { msg = msg + String.format(" Interface=%s\n", theInterface.getName()); } theClass = theClass.getSuperclass(); } msg = msg + "\n" + msgTrailer; return msg; } } 

以及在自己的java文件上运行插件的结果。

插件结果

有一个漫长的一天在这里通过答案和许多其他答案,并发现最终让我在那里的位是做一个Javareflection循环来研究从树中的选择的类和接口结构航海家。 类内省循环处于最后的静止位置,但最初更接近执行方法的顶部。

 import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.handlers.HandlerUtil; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeSelection; import org.eclipse.jface.viewers.TreePath; import org.eclipse.jface.viewers.TreeSelection; public class MyHandler extends AbstractHandler { /** * The constructor. */ public MyHandler() { } public Object execute(ExecutionEvent event) throws ExecutionException { IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindow(event); IWorkbenchPage activePage = window.getActivePage(); ISelection selection = activePage.getSelection(); if (selection != null) { System.out.println("Got selection"); if (selection instanceof IStructuredSelection) { System.out.println("Got a structured selection"); if (selection instanceof ITreeSelection) { TreeSelection treeSelection = (TreeSelection) selection; TreePath[] treePaths = treeSelection.getPaths(); TreePath treePath = treePaths[0]; System.out.println("Last"); Object lastSegmentObj = treePath.getLastSegment(); Class currClass = lastSegmentObj.getClass(); while(currClass != null) { System.out.println(" Class=" + currClass.getName()); Class[] interfaces = currClass.getInterfaces(); for(Class interfacey : interfaces) { System.out.println(" I=" + interfacey.getName()); } currClass = currClass.getSuperclass(); } if(lastSegmentObj instanceof IAdaptable) { IFile file = (IFile) ((IAdaptable) lastSegmentObj).getAdapter(IFile.class); if(file != null) { System.out.println("File=" + file.getName()); String path = file.getRawLocation().toOSString(); System.out.println("path: " + path); } } } } } return null; } }