gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:30:14 26 4
gpt4 key购买 nike

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

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

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

我已经成功地向我的插件添加了一个内容类型,我可以根据某些标准区分不同的文件。所以,当我有一个 java .inc文件并分配内容类型 inc file (java) .

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

我目前想到的方法:

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

  • 有更好的解决方案吗?您是否对我列出的任何方法有更多了解?

    最佳答案

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

    让我们从 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>

    OpenActionProvider 看起来像这样:
    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);
    }
    }

    OpenEditorActionGroup 看起来像这样:
    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);
    }

    AbstractActionGroup 只是一个包装器,如果您想实现更多这些:
    package myplugin.navigator;
    import org.eclipse.core.runtime.Assert;
    import org.eclipse.jface.action.IMenuManager;
    import org.eclipse.jface.resource.ImageDescriptor;
    import org.eclipse.ui.IActionBars;
    import org.eclipse.ui.IViewPart;
    import org.eclipse.ui.actions.ActionGroup;

    public abstract class AbstractActionGroup extends ActionGroup {
    private final IViewPart fViewPart;

    public AbstractActionGroup(IViewPart viewPart) {
    Assert.isNotNull(viewPart);
    fViewPart = viewPart;
    makeActions();
    }

    protected IViewPart getViewPart() {
    return fViewPart;
    }

    protected ImageDescriptor getImageDescriptor(String relativePath) {
    return ImageDescriptor.createFromURL(null);
    }

    protected abstract void makeActions();
    @Override
    public abstract void fillContextMenu(IMenuManager menu);
    @Override
    public abstract void fillActionBars(IActionBars actionBars);
    @Override
    public abstract void updateActionBars();
    }

    最后是 OpenGenElementAction 本身:
    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);
    }
    }

    关于eclipse-plugin - 使用不同编辑器处理相同文件扩展名的 Eclipse 插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5728651/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com