无需打开编辑器即可在 Eclipse 插件中获取项目
Get project in Eclipse plugin without having an open editor
在Eclipse插件中很容易获取当前项目(IProject
)如果打开了编辑器,你只需要使用这个片段:
IEditorPart editor = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
IFileEditorInput input = (IFileEditorInput)editor.getEditorInput();
IFile file = input.getFile();
IProject project = file.getProject();
但是,如果我没有在编辑器中打开任何类型的文件,有没有办法获取该项目?即:想象一下,当您右键单击一个项目时,您有一个插件可以添加一个选项,如果单击此选项,将启动一个对话框 window,我如何在此对话框中打印项目名称?
对于使用 'command' 和 'handler' 的菜单项等,您可以在处理程序中使用如下代码:
public class CommandHandler extends AbstractHandler
{
@Override
public Object execute(ExecutionEvent event) throws ExecutionException
{
ISelection sel = HandlerUtil.getCurrentSelection(event);
if (sel instanceof IStructuredSelection)
{
Object selected = ((IStructuredSelection)sel).getFirstElement();
IResource resource = (IResource)Platform.getAdapterManager().getAdapter(selected, IResource.class);
if (resource != null)
{
IProject project = resource.getProject();
...
}
}
return null;
}
}
"The current project" 是什么意思?获取特定项目总是需要某种方式来唯一标识那个特定项目。
如果通过 current project 你的意思是该项目是开放的,那么这不是一个很好的唯一性标准(在一般情况下),因为多个项目可以同时开放同时.
唯一定义项目的保证是获取对该项目包含的资源的引用。例如,这可以通过编辑器输入完成,如您所述,或通过选择完成,如 .
如果您有项目名称,那么您可以使用 IWorkspaceRoot#getProject(String)
,但我认为情况并非如此。尽管如此,为了完整起见:
ResourcesPlugin.getWorkspace().getRoot().getProject("MyProject");
您还可以获得所有项目的列表,并遍历该列表以检查您知道该项目具有的 属性(或项目 具有 ).请参见下面的示例。当然,这在一般情况下也不能保证唯一性,因为可以有多个项目满足条件。这就是我在示例中使用列表的原因。
IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
List<IProject> openProjects = new ArrayList<>();
List<IProject> myNatureProjects = new ArrayList<>();
for(IProject project : projects)
{
if(project.isOpen())
openProjects.add(project);
if(project.hasNature("MyNatureId")
myNatureProjects.add(project);
}
在Eclipse插件中很容易获取当前项目(IProject
)如果打开了编辑器,你只需要使用这个片段:
IEditorPart editor = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
IFileEditorInput input = (IFileEditorInput)editor.getEditorInput();
IFile file = input.getFile();
IProject project = file.getProject();
但是,如果我没有在编辑器中打开任何类型的文件,有没有办法获取该项目?即:想象一下,当您右键单击一个项目时,您有一个插件可以添加一个选项,如果单击此选项,将启动一个对话框 window,我如何在此对话框中打印项目名称?
对于使用 'command' 和 'handler' 的菜单项等,您可以在处理程序中使用如下代码:
public class CommandHandler extends AbstractHandler
{
@Override
public Object execute(ExecutionEvent event) throws ExecutionException
{
ISelection sel = HandlerUtil.getCurrentSelection(event);
if (sel instanceof IStructuredSelection)
{
Object selected = ((IStructuredSelection)sel).getFirstElement();
IResource resource = (IResource)Platform.getAdapterManager().getAdapter(selected, IResource.class);
if (resource != null)
{
IProject project = resource.getProject();
...
}
}
return null;
}
}
"The current project" 是什么意思?获取特定项目总是需要某种方式来唯一标识那个特定项目。
如果通过 current project 你的意思是该项目是开放的,那么这不是一个很好的唯一性标准(在一般情况下),因为多个项目可以同时开放同时.
唯一定义项目的保证是获取对该项目包含的资源的引用。例如,这可以通过编辑器输入完成,如您所述,或通过选择完成,如
如果您有项目名称,那么您可以使用 IWorkspaceRoot#getProject(String)
,但我认为情况并非如此。尽管如此,为了完整起见:
ResourcesPlugin.getWorkspace().getRoot().getProject("MyProject");
您还可以获得所有项目的列表,并遍历该列表以检查您知道该项目具有的 属性(或项目 具有 ).请参见下面的示例。当然,这在一般情况下也不能保证唯一性,因为可以有多个项目满足条件。这就是我在示例中使用列表的原因。
IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
List<IProject> openProjects = new ArrayList<>();
List<IProject> myNatureProjects = new ArrayList<>();
for(IProject project : projects)
{
if(project.isOpen())
openProjects.add(project);
if(project.hasNature("MyNatureId")
myNatureProjects.add(project);
}