Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Eclipse plugin Eclipse插件,用不同的编辑器处理相同的文件扩展名_Eclipse Plugin_Editor - Fatal编程技术网

Eclipse plugin Eclipse插件,用不同的编辑器处理相同的文件扩展名

Eclipse plugin Eclipse插件,用不同的编辑器处理相同的文件扩展名,eclipse-plugin,editor,Eclipse Plugin,Editor,我正在为Eclipse编写一个插件,它为我们的软件堆栈中使用的特定预处理器指令提供语法高亮显示。在编译实际代码之前,这些代码会被一个外部程序替换(想象一下像这样的标记会被其他东西替换,比如版本字符串) 因此,该插件为每个标签提供注释,以快速识别这些标签。注释不是实现自己的编辑器,而是为已经存在的编辑器(如JavaEditor或PHP编辑器)提供的 现在的问题是,由外部程序处理的文件都具有相同的文件扩展名,例如.inc。它们可以包含Java代码或PHP代码(将来也可以使用其他语言) 我已经成功地将

我正在为Eclipse编写一个插件,它为我们的软件堆栈中使用的特定预处理器指令提供语法高亮显示。在编译实际代码之前,这些代码会被一个外部程序替换(想象一下像
这样的标记会被其他东西替换,比如版本字符串)

因此,该插件为每个标签提供注释,以快速识别这些标签。注释不是实现自己的编辑器,而是为已经存在的编辑器(如JavaEditor或PHP编辑器)提供的

现在的问题是,由外部程序处理的文件都具有相同的文件扩展名,例如
.inc
。它们可以包含Java代码或PHP代码(将来也可以使用其他语言)

我已经成功地将内容类型添加到我的插件中,并且我可以根据一些标准来区分不同的文件。因此,当我有一个java
.inc
文件并分配内容类型
inc file(java)

但是,用户应该能够覆盖此自动检测(有时自动检测可能会失败)。因此,我希望能够使用不同的编辑器(Java编辑器、PHP编辑器等)打开一个文件(
foo.inc
),并能够保存此关联

我目前考虑的方法是:

  • 覆盖文件打开操作以检查项目中的设置并打开相应的编辑器。我没有找到一个解决方案来涵盖如何覆盖所有文件打开操作(文件→ 在主菜单中打开文件,在项目导航器中打开,…)
  • 实现自己的编辑器,然后打开相应的编辑器。这似乎是一种不切实际的做法,也会造成一些延误
  • 在文件的“打开方式”上下文菜单中,用户可以更改编辑器。以编程方式更改它是可以的,但我找不到API或存储此选项的文件
  • 为项目实现不同的性质,然后在每个性质的上下文中不同地关联文件类型。将只提供特定于项目的关联,而不是每个文件的关联

有更好的解决方案吗?你知道更多关于我列出的方法吗?

我发现了如何覆盖文件打开操作:通过注册一个覆盖
org.eclipse.ui.navigator.resources.OpenActions的
actionProvider
。我提供了所有的代码,因为将所有这些不同的东西放在一起并使其工作起来相对困难

让我们从plugin.xml条目开始:

<!-- overwrite OpenActions -->
<extension
      point="org.eclipse.ui.navigator.navigatorContent">
   <actionProvider
         class="myplugin.navigator.OpenActionProvider"
         id="myplugin.navigator.actions.open"
         overrides="org.eclipse.ui.navigator.resources.OpenActions"
         priority="highest">
      <enablement>
         <and>
            <instanceof
                  value="org.eclipse.core.resources.IFile">
            </instanceof>
            <test
                  property="org.eclipse.core.resources.extension"
                  value="frm">
            </test>
         </and>
      </enablement>
   </actionProvider>
</extension>
<extension
      point="org.eclipse.ui.navigator.viewer">
   <viewerActionBinding
         viewerId="org.eclipse.ui.navigator.ProjectExplorer">
      <includes>
         <actionExtension
               pattern="myplugin.navigator.actions.open">
         </actionExtension>
      </includes>
   </viewerActionBinding>
</extension>
OpenEditorActionGroup如下所示:

package myplugin.navigator;

import org.eclipse.jface.action.IMenuManager;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.actions.ActionContext;
import org.eclipse.ui.navigator.CommonActionProvider;
import org.eclipse.ui.navigator.ICommonActionConstants;
import org.eclipse.ui.navigator.ICommonActionExtensionSite;
import org.eclipse.ui.navigator.ICommonViewerWorkbenchSite;

public class OpenActionProvider extends CommonActionProvider {
    private OpenEditorActionGroup fOpenGroup;

    @Override
    public void init(ICommonActionExtensionSite site) {
            ICommonViewerWorkbenchSite workbenchSite = null;
            if (site.getViewSite() instanceof ICommonViewerWorkbenchSite) {
                    workbenchSite = (ICommonViewerWorkbenchSite) site.getViewSite();
            }
            if (workbenchSite != null) {
                    if (workbenchSite.getPart() != null && workbenchSite.getPart() instanceof IViewPart) {
                            IViewPart viewPart = (IViewPart) workbenchSite.getPart();

                            fOpenGroup = new OpenEditorActionGroup(viewPart);
                    }
            }
    }

    @Override
    public void dispose() {
            if (fOpenGroup != null) {
                    fOpenGroup.dispose();
                    fOpenGroup = null;
            }
            super.dispose();
    }

    @Override
    public void fillActionBars(IActionBars actionBars) {
            if (fOpenGroup == null)
                    return;

            fOpenGroup.updateActionBars();
            actionBars.setGlobalActionHandler(ICommonActionConstants.OPEN, fOpenGroup.getOpenAction());
    }

    @Override
    public void fillContextMenu(IMenuManager menu) {
            if (fOpenGroup == null)
                    return;
            fOpenGroup.fillContextMenu(menu);
    }

    @Override
    public void setContext(ActionContext context) {
            super.setContext(context);
            if (fOpenGroup == null)
                    return;
            fOpenGroup.setContext(context);
    }
}
package myplugin.navigator;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.actions.OpenFileAction;
import org.eclipse.ui.actions.OpenWithMenu;
import org.eclipse.ui.navigator.ICommonMenuConstants;


public class OpenEditorActionGroup extends AbstractActionGroup {
    private OpenFileAction fOpenFileAction;

    public OpenEditorActionGroup(IViewPart viewPart) {
            super(viewPart);
    }

    @Override
    protected void makeActions() {
            fOpenFileAction= new OpenGenElementAction(getViewPart().getSite().getPage());
    }

    public static IStructuredSelection convertSelectionToResources(ISelection s) {
            List<Object> converted = new ArrayList<Object>();
            if (s instanceof StructuredSelection) {
                    Object[] elements = ((StructuredSelection) s).toArray();
                    for (int i = 0; i < elements.length; i++) {
                            Object e = elements[i];
                            if (e instanceof IResource) {
                                    converted.add(e);
                            } else if (e instanceof IAdaptable) {
                                    IResource r = (IResource) ((IAdaptable) e).getAdapter(IResource.class);
                                    if (r != null) {
                                            converted.add(r);
                                    }
                            }
                    }
            }
            return new StructuredSelection(converted.toArray());
    }


    @Override
    public void fillContextMenu(IMenuManager menu) {
            System.out.println("fillcontextmenu");
            if (getContext() == null)
                    return;
        IStructuredSelection celements = (IStructuredSelection)getContext().getSelection();
            IStructuredSelection selection = convertSelectionToResources(celements);

            fOpenFileAction.selectionChanged(celements);
            if (!fOpenFileAction.isEnabled())
                    return;
            menu.appendToGroup(ICommonMenuConstants.GROUP_OPEN, fOpenFileAction);
            fillOpenWithMenu(menu, selection);
    }
最后是OpenGeneElementAction本身:

package myplugin.navigator;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.OpenFileAction;
import org.eclipse.ui.editors.text.EditorsUI;
import org.eclipse.ui.part.FileEditorInput;

public class OpenGenElementAction extends OpenFileAction {
    private IFile selectedFile = null;
    private final IWorkbenchPage workbenchPage;

    public OpenGenElementAction(IWorkbenchPage page) {
            super(page);
            workbenchPage = page;
    }

    @Override
    public boolean isEnabled() {
            return true;
    }

    @Override
    public void run() {
            System.out.println("RUN");
    }

    @Override
    protected boolean updateSelection(IStructuredSelection selection) {
            if (selection.size() != 1)
                    return super.updateSelection(selection);
            Object element = selection.getFirstElement();
            if (element instanceof IFile) {
                    selectedFile = (IFile)element;
            }

            return selectedFile != null || super.updateSelection(selection);
    }
}

您可以通过注册特定的文件名而不仅仅是扩展名,以编程方式直接攻击IEditorRegistry

请看:“IEditorRegistry帮助”

方法:

void    setDefaultEditor(String fileNameOrExtension, String editorId) 
      Sets the default editor id for the files that match
      that specified file name or extension.
接受全名和/或通配符。大多数openEditor调用(菜单、工具栏等)最终都会调用此注册表以获取适当的编辑器。 在打开专门注册此文件名的编辑器时设置一个钩子


如果您有两个名称相同、语言不同的文件,这并不是万无一失的,但与您的方法相比,它实现起来又快又容易。

之后,我发现这段代码在Package Explorer和Project Navigator中都不起作用:(。感谢您发布这段代码!
void    setDefaultEditor(String fileNameOrExtension, String editorId) 
      Sets the default editor id for the files that match
      that specified file name or extension.