简体   繁体   English

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

[英]Eclipse Plugin: how to get the path to the currently selected project

I am writing an Eclipse plugin that will display a menu item in the context menu for a Java Project. 我正在编写一个Eclipse插件,它将在Java项目的上下文菜单中显示一个菜单项。 I have written the plugin.xml as follows: 我编写了plugin.xml,如下所示:

<plugin>
   <extension
         point="org.eclipse.ui.menus">
      <menuContribution
            locationURI="popup:org.eclipse.jdt.ui.PackageExplorer">
         <dynamic
               class="uk.co.dajohnston.plugin.classpathswitcher.menu.MenuContribution"
               id="uk.co.dajohnston.plugin.classpathSwitcher.switchMenuContribution">
            <visibleWhen>
               <with
                     variable="activeMenuSelection">
                  <iterate>
                     <adapt
                           type="org.eclipse.jdt.core.IJavaProject">
                     </adapt>
                  </iterate>
                  <count
                        value="1">
                  </count>
               </with>
            </visibleWhen>
         </dynamic>
      </menuContribution>
   </extension>

</plugin>

So I am now trying to write the MenuContribution class which extends CompoundContributionItem so that I can create a dynamic menu and the contents of this menu are going to be based on a set of files that exist in the Java Project's root directory. 所以我现在正在尝试编写扩展CompoundContributionItemMenuContribution类,以便我可以创建一个动态菜单,该菜单的内容将基于Java Project根目录中存在的一组文件。 But I am stuck trying to get the path to the root directory from within the getContributionItems method. 但是我试图从getContributionItems方法中获取到根目录的路径。

Based on the plugin.xml file I can be guarenteed that the method will only be called if a single Java Project is selected, so all I need to do is get the current selection and then get its absolute path. 基于plugin.xml文件,我可以保证仅在选择单个Java项目时才调用该方法,因此我需要做的就是获取当前选择,然后获取其绝对路径。 Any ideas? 有任何想法吗? Or is there a better way to do this? 或者有更好的方法吗?

This should get you closer (if not solve it completely for you ;)) 这应该让你更接近(如果没有完全为你解决;))

    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);
        }
    }

Since I wrote the previous answer I have written another couple of utility plugins and now have a generic starter for Eclipse Navigator Popups. 自从我写完之前的答案以来,我已经编写了另外两个实用程序插件,现在有了Eclipse Navigator Popups的通用启动器。 The files are as follows: 文件如下:

Basic manifest file 基本清单文件

MANIFEST.MF 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

Basic properties file 基本属性文件

build.properties build.properties

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

Plugin file 插件文件

In particular note how <command commandId=...> of the <menuContribution...> <menu..> in the <extension point="org.eclipse.ui.menus"> extension point links to the <handler commandId=...> in the <extension point="org.eclipse.ui.handlers"> extension point this permits us to link multiple menu contributions to a single handler. 特别注意<extension point =“org.eclipse.ui.menus”>扩展点中<menucontribution ...> <menu ..>的 <command commandId = ...>链接到<handler commandId = ...><extension point =“org.eclipse.ui.handlers”>扩展点中,这允许我们将多个菜单贡献链接到单个处理程序。

Also of note is the fact that there are multiple locationURI 's as these can change from one perspective to another. 另外值得注意的是,有多个locationURI ,因为它们可以从一个角度改变到另一个角度。

plugin.xml plugin.xml中

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
    <extension point="org.eclipse.ui.commands">
        <category name="NSD Category" id="com.nsd.NavigatorPopup.commands.category"/>
        <command name="Navigator Popup" categoryId="com.nsd.NavigatorPopup.commands.category" id="com.nsd.NavigatorPopup.commands.navigatorPopupCommand"/>
    </extension>
    <extension point="org.eclipse.ui.handlers">
        <handler commandId="com.nsd.NavigatorPopup.commands.navigatorPopupCommand" class="com.nsd.navigatorpopup.NavigatorPopupHandler"/>
    </extension>
    <extension point="org.eclipse.ui.menus">
        <menuContribution locationURI="popup:org.eclipse.jdt.ui.PackageExplorer?after=additions">
            <menu label="Popup Utilities">
                <command commandId="com.nsd.NavigatorPopup.commands.navigatorPopupCommand" id="com.nsd.NavigatorPopup.menus.navigatorPopupCommand"/>
            </menu>
        </menuContribution>
        <menuContribution locationURI="popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?after=additions">
            <menu label="Popup Utilities">
                <command commandId="com.nsd.NavigatorPopup.commands.navigatorPopupCommand" id="com.nsd.NavigatorPopup.menus.navigatorPopupCommand"/>
            </menu>
        </menuContribution>
    </extension>
</plugin>

To find out more about the plugin for the current selection click on a file and use ALT-SHIFT-F1 for the Plug-in Selection Spy 要了解有关当前选择的插件的更多信息,请单击文件并使用ALT-SHIFT-F1作为插件选择间谍

插件选择间谍

Use ALT-SHIFT-F2 for the Plug-in Menu Spy. 使用ALT-SHIFT-F2作为插件菜单间谍。 Note press the ALT-SHIFT-F2 combination before right clicking and selecting the popup menu item of interest. 注意在右键单击并选择感兴趣的弹出菜单项之前按ALT-SHIFT-F2组合。 插件菜单间谍

Finally the code for the plug-in. 最后是插件的代码。

NavigatorPopupHandler.java 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;
    }
}

And the result of running the plug-in on its own java file. 以及在自己的java文件上运行插件的结果。

插件结果

Had a very long day working my way through the answers here and a whole lot of other answers and found the bit that finally got me there was to do a Java Reflection loop to study the Class and Interface structure of the selection from the Tree in the navigator. 有一个漫长的一天在这里通过答案和许多其他答案,并发现最终让我在那里的位是做一个Java反射循环来研究从树中的选择的类和接口结构航海家。 The Class introspection loop is in its final resting place but was originally much closer to the top of the execute method. Class内省循环处于最终的休息位置,但最初更接近execute方法的顶部。

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;
}
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Eclipse插件开发人员:如何获取当前所选项目的路径? - Eclipse Plugin Dev: How do I get the paths for the currently selected project? 如何使用插件在eclipse中获取项目文件的绝对路径 - How to get the absolute path of project files in eclipse using plugin 如何从Eclipse插件获取包资源管理器中选定节点的完整路径? - How to get full path of the selected node in the package explorer from an Eclipse plugin? eclipse插件:选定项目更改时获取通知 - eclipse plugin: get notification when selected project changed Eclipse插件:扩展INewWizard的新文件向导,如何在其中创建所选项目 - Eclipse plugin: New file wizard extending INewWizard, how to get selected project to create in it Intellij IDEA 插件如何获取当前打开文件的路径? - Intellij IDEA plugin how to get path of currently opened file? 从eclipse-plugin运行获取项目链接资源路径 - get project Linked resources path from eclipse-plugin run 获取Eclipse中当前编辑文件的绝对路径 - Get the absolute path of the currently edited file in Eclipse 如何在JSP页面中获取Eclipse项目的路径 - How to get the path of an eclipse project in jsp page 如何在Eclipse项目中获取和使用文件夹的路径? - How to get and use the path of a folder in eclipse project?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM