Eclipse TextEditorAction如何知道当前文件所在的项目?

时间:2016-01-10 04:28:45

标签: java eclipse eclipse-plugin

我正在为一个有点复杂的Eclipse插件开发一个继承的代码库,该插件用于以自定义规范语言查看和编辑文件。

语言是什么并不重要,但它与CORBA IDL和XML XSD具有功能相似性。在一个模块中,我可以“导入”另一个模块,并将要使用的前缀与对这些导入组件的引用相关联,以防止名称冲突。

该插件定义了一个“OpenDeclarationAction”,它应该与JDT中的类似动作完全相同。在对组件的引用上执行时,它将调出定义该组件的模块,并将光标放在组件的定义上。

我注意到插件有一个bug,如果工作区中有两个不同的项目,有两个同名的文件,在这个自定义语言中,当我执行“OpenDeclarationAction”时,它只会打开那个模块。首先在索引工作空间时找到,而不是优先选择与原始模块相同的项目中的模块。

当我查看组件的内部索引时,我看到它不是每个模块和组件来自哪个项目,所以我认为修复这很容易,因为当动作执行时,我可以将当​​前项目与索引中条目的项目,只有在匹配时才使用它。

然而,我意识到在我的自定义TextEditorAction中,它是从我的自定义“org.eclipse.ui.editors.text.TextEditor”子类实例化的,虽然我使用的“索引搜索”功能可以接受“ project“参数,我无法从TextEditorAction内部找到知道当前项目是什么。

例如,这里是我的“TextEditor”子类的摘录,我创建了TextEditorAction子类(OpenDeclarationAction):

    @Override
protected void createActions() {

    super.createActions();
    IAction action = null;
    ResourceBundle bundle = ResourceBundle.getBundle(YangEditorMessages.getBundleName());

    action = new TextOperationAction(bundle, "ContentFormat_", this, ISourceViewer.FORMAT); //$NON-NLS-1$
    action.setActionDefinitionId(IYangEditorActionDefinitionIds.FORMAT);
    setAction("FormatDocument", action); //$NON-NLS-1$

    action = getAction(ITextEditorActionConstants.CONTENT_ASSIST_CONTEXT_INFORMATION);

    action = new OpenDeclarationAction(bundle, "OpenDeclaration_", this); //$NON-NLS-1$
    action.setActionDefinitionId(IYangEditorActionDefinitionIds.OPEN_DECLARATION);
    setAction("OpenDeclaration", action); //$NON-NLS-1$
    markAsStateDependentAction("OpenDeclaration", true); //$NON-NLS-1$
    markAsSelectionDependentAction("OpenDeclaration", true); //$NON-NLS-1$

这是我的一些OpenDeclarationAction类:

public class OpenDeclarationAction extends TextEditorAction {

public OpenDeclarationAction(ResourceBundle bundle, String prefix, ITextEditor editor) {
    super(bundle, prefix, editor);
}

@Override
public void run() {
    YangEditor editor = (YangEditor) getTextEditor();

    try {
        ISelection selection = editor.getSelectionProvider().getSelection();
        Module module = YangParserUtil.parseYangFile(editor.getDocument().get().toCharArray());
        ASTNode node = module.getNodeAtPosition(((ITextSelection) selection).getOffset());

我已经探索了发送到OpenDeclarationAction类的所有参数,包括它们的所有“get”方法,以查看是否存在可能导致当前项目的任何调用链。这似乎是一个死路一条。如果项目可用,我想在某处必须有一些“反向”数据结构,它将从我拥有的其他一些数据中为我提供项目。

我知道这样的事情是可能的,因为我在两个不同的项目中使用相同的Java类来尝试相同的情况。 Eclipse总是把我发送到与引用相同的项目中的类。

我可以做些什么来设置它以便这样做我想要的?

1 个答案:

答案 0 :(得分:0)

ITextEditor.getEditorInput()可能包含IEditorInput的后代,其中包含IFileURI个信息。鉴于这些,您可以通过调用解析URI的IFile.getProject()来派生IProject。