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

我写一个Eclipse插件,将在Java项目上下文菜单中显示的菜单项。 我写这个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>

所以,我现在想写的MenuContribution延伸类CompoundContributionItem ,这样我可以创建一个动态菜单,并根据一组存在于Java项目的根目录下的文件该菜单的内容会。 但我坚持试图从内部获取路径到根目录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);
}
}

有一个非常漫长的一天经过这里的答案和很多其他的答案的工作我的方式,发现终于得到了我的位有做一个Java反射循环研究从树中选择的类和接口结构航海家。 类自省循环已进入最后的安息之地,但原本是更接近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;
}
}

自从我写了以前的答案我已经写了另一对夫妇实用插件,现在有Eclipse的导航弹出窗口的通用首发。 的文件如下:

基本的清单文件

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/,\
.

插件文件

特别注意到如何<命令commandId = ...><menuContribution ...><菜单..> < 扩展点=“org.eclipse.ui.menus”>扩展点链接到<处理commandId = ...> < 扩展点=“org.eclipse.ui.handlers”>扩展点这使我们能够多个菜单的贡献链接到一个单一的处理程序。

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

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>

要了解更多关于插件上的文件和使用ALT-SHIFT-F1的插件选择间谍当前选择点击

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

使用ALT-SHIFT-F2的插件菜单间谍。 注意按下右键点击并选择感兴趣的弹出式菜单项前的ALT-SHIFT-F2组合。 Eclipse插件:如何获取路径当前选定的项目

最后对插件的代码。

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文件的结果。

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

分类:java的 时间:2012-01-01 人气:115
分享到:

相关文章

  • 如何删除尾随空格中的PyDev的Eclipse插件 2014-11-19

    理想的情况是,当我保存文件日食应该删除所有尾随空白. 我知道有这个在C ++ / Java的的Eclipse插件选项,但我无法找到一个的PyDev. 有一? 如果没有,什么最简单的方法来实现这一目标? --------------解决方案------------- 报到: 首选项>的PyDev>编辑>代码样式>代码格式化 并检查"正确修剪线?" 复选框. 我偶然accros这个有用[现场] [1] [1]:http://andrei.gmxhome.de/any

  • 是否有可能在一个项目中同时使用了Android Eclipse插件和Android命令行工具? 2012-09-14

    我在与一些谁喜欢使用Android的Eclipse插件成员和一些谁喜欢使用其他编辑器,因此使用Android的命令行工具,一个团队. 我们即将与来自两个阵营的成员启动一个项目,所以我不知道是否有可能在同一时间同时使用Eclipse插件和命令行工具,使每个人都可以在自己喜欢的环境中工作. 就个人而言,我已经使用VIM和Android开发的命令行工具迄今. 我一看Eclipse插件,看是否与命令行工具的互操作性是可能的,但似乎该插件不会产生任何的命令行工具使用Ant构建文件. 有一些办法让Eclip

  • 如何打印到Java堆栈跟踪控制台在一个Eclipse插件? 2013-05-04

    我创建为Eclipse插件,我想打印在"Java堆栈跟踪控制台"消息和异常. 我创建一个新的MessageConsole打印的消息,但异常堆栈跟踪打印纯文本,没有链接的类和方法. 它是如何工作的? --------------解决方案------------- 如果在你的启动配置参数(或命令行),您将添加-consoleLog参数,然后记录(在工作区{} writenn /.元/ .log文件)也将被复制到控制台. 堆栈跟踪是从那里通航. 这不是你exactyly想要的,但可能的帮助.

  • 共享一个独立的Eclipse RCP应用程序中的多个Eclipse插件之间的单一.aj的AspectJ aspect 2014-03-19

    快速免责声明:我运行Eclipse 3.5,我不能升级到最新版本. 我真的不希望任何人去解释这是不敬,但请不要问我为什么. 我想知道什么是最好的(和犹太)的方式来共享包含单个独立的RCP应用程序的多个Eclipse插件之间的单一.aj方面的文件. 我已经看到了一些例子,其中一个插件包含在其包中的一个一个.aj方面的文件. 但我猜测,必须有不是为每个插件项目承担自己完全相同的副本.aj一个更好的办法. 是不是有办法"集中"的.aj文件,然后从每个插件项目中引用呢? -----------

  • 在java中读取文件(Eclipse IDE中使用) 2014-02-21

    我试图写一段Java代码从文件中读取每一行,并把它添加到一个ArrayList. 这里是我的代码. // try catch block removed for clarity. file = new TextFileIn("names.txt"); String line = null; while ((line = file.readLine()) != null) { list.add(line); } 定位于为我的代码相同的包文件夹names.txt中. 我使用的IDE是日食.

  • 在脉冲资源管理器中安装史诗(Eclipse插件) 2012-02-09

    我试图用浏览器的脉冲为Eclipse(因为我比较喜欢分享型材:)安装EPIC. 当我去安装在我的账户上的插件,我被问了一个登录到http://epic.sf.net 然而,Epic的球队文档中并没有提及有关登录任何东西. 下面是我做了什么: 已经进入脉冲并创建了一个基于Eclipse的经典新的配置文件. 导航到软件,增加了EPIC公司网站公开网站列出,并选择安装它. 增加了脉冲项个人资料. 运行安装程序. 错误显示出来,而这一切都下载/安装. 登录框开始出现史诗般的相关组件,而我没有凭据放在让所

  • 创建Java中的文本编辑器Eclipse的样线标志杆 2012-07-02

    我的Java GUI应用程序包含一个可滚动的文本窗口. 除了标准的滚动条,我需要用彩色线条标记竖线,就像在Eclipse. 希望你知道我是什么谈论. 这条不滚动,标记位置按比例安排整个文本的高度. 当用户点击任何标记,文本框滚动到相应的线路. 我无法找到SWT部件套件这样的控制. 显然SWT包含在某个地方. 对我来说,理想的选择是Swing组件,因为应用是基于Swing. 提前谢谢了. --------------解决方案------------- 我不认为这是与Swing捆绑的一个组成部分,我

  • 阅读Java中的文件从Eclipse链接的文件夹 2013-12-22

    所以,我试图读取一个Eclipse的Java项目中的文件. 资源本身是我使用已经添加了一个链接的文件夹: New -> Folder. Advanced >> Link folder etc. 我无法打开文件,所以我写了一个简单的方法来找出我可以访问: public static void main(String[] args) { File folder = new File("."); String[] listOfFiles = folder.list(); f

  • 在Java中搜索在Eclipse插件目标 2014-04-18

    我想知道我们如何可以包括在Java中搜索所有的目标插件一次. 我知道如何在包含在Java中搜索一个目标插件,但我不知道如何将所有目标插件在Java中搜索一次. --------------解决方案------------- 确保选中该选项 - "首选项>插件开发>包括从目标在Java中搜索所有的插件" 看一看在第三项 http://archive.eclipse.org/eclipse/downloads/drops/R-3.6-201006080911/eclipse-n

  • 可以在Eclipse插件非Java代码中使用? 2013-05-06

    我使用已经进行了一段时间的工具,我喜欢它这么多,我想它作为一个Eclipse插件. 不幸的是,我认为这是用C ++编写. 有没有什么办法这样一个代码库可以作为基础,一个Eclipse插件,而无需重新编写它的Java? 顺便说一句:将工具封闭源,商业,由其他人保持,将需要作为一个GUI部件. 我主要是想知道这将是在所有可能的是我会说话的车主到这样做. --------------解决方案------------- 你总是可以使用JNI 你可以尝试创建使用痛饮(或纯JNI,这是一个重大的PITA虽然

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.536 (s). 10 q(s)