4

我正在尝试向 Package Explorer 弹出上下文菜单中添加一个条目,当该条目被选中时,该菜单会在编辑器中打开文件的修改版本。

我在 Fedora 15 笔记本电脑上使用 Eclipse Indigo。

这是一个非常具体的问题,它可能具有充分的重点,并且可能会提供解决我遇到的一般问题所需的帮助。

Eclipse 提供了一个名为 org.eclipse.ui.examples.readmetool 的示例插件,可以从 Help->Welcome 页面进行设置。

这个插件定义了一个名为 ReadmeEditor.java 的编辑器。它还在plugin.xml 中定义了一个扩展点“org.eclipse.ui.popupMenus”。当您从 Eclipse 项目资源管理器视图中对后缀为“.readme”的文件使用此操作时,您只会看到一个小弹出窗口。

如何更改 readmetool 插件,以便当您在 foo.readme 文件上选择上面定义的项目资源管理器菜单项时,您会在 eclipse 中获得一个新的 ReadmeEditor,其中包含 foo.readme?

我正在努力解决的更具体的项目需求如下:

  • 从包资源管理器中,导航到一个文件。

  • 右键单击文件以弹出上下文菜单

  • 查看新条目“版本视图”

  • 选择该条目后,找到该文件,通过外部程序运行它以创建一个临时文件,并在新的 TextEditor 窗口中显示该临时文件的内容。(并且,不要在不再需要后留下孤立的临时文件。)

我有上面的一些部分;我扩充了 MultiPageEditor 示例,以便它完成运行外部程序、创建临时文件和在文本编辑器中打开临时文件的工作。

但是,我目前可以访问该功能的唯一方法是在项目资源管理器中的文件的弹出上下文窗口中选择“打开方式”选项,然后转到该窗口中的“其他”并选择我的新编辑器选项.

所以,我现在卡住的地方是如何向 plugin.xml 添加正确的魔法,以便我在项目管理器弹出上下文窗口中获得一个新选项,并将其与新的 TextEditor 窗口连接起来。

这看起来很像香草“打开”选项会做的事情,而且这似乎应该是在 Eclipse 中做的一件非常基本的事情。任何示例和/或指导将不胜感激。

格雷格

4

3 回答 3

6

这是设置和使用项目的一个简洁但完整的示例。(在网上搜索,有很多关于 eclipse 的建议,但它往往是相当零散和零碎的,当我努力解决我的问题时,拥有一个完整的、独立的 HOWTO 会很有帮助。所以,这是那..)

这个秘籍假设你正在使用 Eclipse Indigo 或 Juno:

  • 面向 Java 开发人员的 Eclipse IDE
  • Eclipse 插件开发环境。

要在 Eclipse 中确认上述内容,请参阅

Help -> About Eclipse -> Installation Details -> Installed Software
  1. 使用全新的空工作区启动 Ecipse Indigo:

    you, before starting eclipse:
              move or delete ~/eclipse.d/popup_workspace.d
              mkdir -p ~/eclipse.d/popup_workspace.d
    start eclipse:  eclipse
    eclipse:  "Select a workspace"
    you:      "Browse", navigate to above-created popup_workspace.d; "OK" "OK"
    eclipse:  "Welcome to Eclipse IDE for Java Developers"
    you:      select "Workbench"
    
  2. 创建一个新项目,使用插件项目作为一个方便的起点:

    you:      File -> New -> Project
    eclipse:  "Select a wizard:
    you:      Plug-in Development -> Plug-in Project;  Next>
    eclipse:  "Plug-in Project"
    you:      Project name:  org.mypopup.popup_editor  Next>
    eclipse:  "Content"
    you:      Next>
    eclipse:  "Templates"
    you:      Plug-in with a popup menu                Finish
    eclipse:  "This kind of project is associated with the
              Plug-in Development perspective..."
    you:      Yes
    
  3. 在“Package Explorer 中,导航到 NewActions.java 并双击打开:

    org.mypopup.popup_editor
        -> src
            -> org.mypopup.popup_editor.popup.actions
                -> NewAction.java
    
    delete entire contents and replace with:
    
    package org.mypopup.popup_editor.popup.actions;
    
    import org.eclipse.jface.viewers.TreeSelection;
    import org.eclipse.jface.viewers.TreePath;
    import org.eclipse.core.resources.IFile;
    import org.eclipse.core.filesystem.EFS;
    import org.eclipse.core.runtime.IPath;
    import org.eclipse.jface.action.IAction;
    import org.eclipse.jface.viewers.ISelection;
    import org.eclipse.ui.IObjectActionDelegate;
    import org.eclipse.ui.IWorkbenchPage;
    import org.eclipse.ui.IWorkbenchPart;
    import org.eclipse.ui.IWorkbenchWindow;
    import org.eclipse.ui.PlatformUI;
    import org.eclipse.ui.ide.IDE;
    
    public class NewAction implements IObjectActionDelegate {
        public NewAction() {
            super();
        }
    
        public void run(IAction action) {
            try {
                IWorkbenchWindow window =
                        PlatformUI.getWorkbench().getActiveWorkbenchWindow();
    
                ISelection selection = window.getSelectionService()
                        .getSelection("org.eclipse.ui.navigator.ProjectExplorer");
    
                TreePath[] paths = ((TreeSelection) selection).getPaths();
                TreePath p = paths[0];
                Object last = p.getLastSegment();
    
                if (last instanceof IFile) {
                    IPath ipath = ((IFile) last).getLocation();
    
                    IWorkbenchPage page = window.getActivePage();
    
                    IDE.openEditorOnFileStore(page,
                            EFS.getLocalFileSystem().getStore(ipath));
                }
            } catch (Exception blah) {
            }
        }
    
        public void setActivePart(IAction action, IWorkbenchPart targetPart) { }
    
        public void selectionChanged(IAction action, ISelection selection) { }
    }
    
  4. 向项目添加依赖项以便能够解析导入:

    in Package Explorer, navigate to and open META-INF -> MANIFEST.MF
    
    Select "Dependencies" tab along the bottom of the resulting
    "org.mypopup.plugin_editor" window
    
    "Add..."; "Select a Plug-in:" enter org.eclipse.core.filesystem; "OK"
    "Add..."; "Select a Plug-in:" enter org.eclipse.ui.ide; "OK"
    
    File -> Save my.popup.popup_editor
    
  5. 使用新的空目标目录运行新项目:

    outside of eclipse, browse to the directory containing popup_workspace.d,
    in this case ~/eclipse.d, and if a folder "runtime-EclipseApplication"
    exists, move it or delete it.
    
    right-click META-INF -> MANIFEST.MF, select Run As -> Eclipse Application
    
    in new eclipse window:
    eclipse:  "Welcome to Eclipse"
    you:      select "Workbench"
    you:      File -> New -> Project
    eclipse:  "Select a wizard"
    you:      General -> Project              Next>
    eclipse:  "Project"
    you:      project name popup_test         Finish
    you:      in Project Explorer, right-click popup_test, select New -> File
    eclipse:  "File"
    you:      File name:  test_file1          Finish
    you:      enter a little text in test_file1, File -> Save; File -> Close
    
  6. 重要时刻:使用新的弹出菜单项打开文件:

    in Project Explorer, right-click popup_test -> test_file1
    select New Submenu -> New Action
    
于 2012-07-07T20:10:25.880 回答
2

readmetool示例已经为 .readme 文件提供了上下文菜单操作:

<extension
     point="org.eclipse.ui.popupMenus">
  <objectContribution
        objectClass="org.eclipse.core.resources.IFile"
        nameFilter="*.readme"
        id="org.eclipse.ui.examples.readmetool">
     <action
           label="%PopupMenus.action"
           icon="$nl$/icons/ctool16/openbrwsr.gif"
           helpContextId="org.eclipse.ui.examples.readmetool.open_browser_action_context"
           class="org.eclipse.ui.examples.readmetool.PopupMenuActionDelegate"
           menubarPath="additions"
           enablesFor="1"
           id="org.eclipse.ui.examples.readmetool.action1">
     </action>
  </objectContribution>
  ...
</extension>

它已命名Show Readme Action,但您可以Version view通过编辑包含相应标签名称的 plugin.properties 将其重命名为:

PopupMenus.action = &Version view

然后你只需要编辑PopupMenuActionDelegate和改变它的实现来做你想做的事:

public class PopupMenuActionDelegate implements IObjectActionDelegate {

    public void run(IAction action) {
        // invoke the external tool and open the result in a new editor
    }
    ...
}
于 2012-07-02T07:05:40.717 回答
1

Here is a small, self-contained example of getting an editor window to open in response to selection of a pop-up window option. As a test, it opens a file with a hard-wired name.

public void run(IAction action) {
    try {
        IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
        File f = new File("/tmp/testum");
        IPath ipath = new Path(f.getAbsolutePath());
        IWorkbenchPage page = window.getActivePage();
        IDE.openEditorOnFileStore(page, EFS.getLocalFileSystem().getStore(ipath));
    } catch (Exception blah) {
        System.err.println("Exception!");
    }
}
于 2012-07-04T20:52:01.123 回答