Eclipse插件开发 - 如何在非文本自定义编辑器中显示默认的IResource上下文菜单?

时间:2017-05-29 09:44:58

标签: java eclipse eclipse-plugin popup swt

我正在编写一个Eclipse插件,用于在自己的自定义编辑器中显示自己的文件类型的内容。 该文件基本上由Project Explorer中的1..n IFile组成,它们显示在SWT TreeView中。 这个TreeView中的条目是一些在平面列表中组织的Beans,但我提供了一个适配器将它们转换为IFile。

  <extension
        point="org.eclipse.core.runtime.adapters">
      <factory
            adaptableType="de.dstg.delta.collections.model.Collection$Member"
            class="de.dstg.delta.collections.CollectionMemberAdapterFactory">
         <adapter
               type="org.eclipse.ui.views.properties.IPropertySource2">
         </adapter>
         <adapter
               type="org.eclipse.core.resources.IFile">
         </adapter>
      </factory>
  </extension>

Eclipse Screenshot

显示自定义SWT菜单没问题,但我认为正确的方法是使用Eclipse菜单结构,特别是通过为Resources提供默认行为。 如何通过在我的SWT TableView中右键单击Project Explorer中的资源来显示默认上下文弹出菜单?

编辑第二个问题已删除

EDIT2 根据greg-449的回答,问题仍然是上下文菜单显示我不希望这种类型的选择有条目。 F.E.我需要删除打开或类似'文件基础'之类的东西,而不是我自己实现它。

我们还有一些来自其他插件的菜单,这些菜单在选择适当的文件类型时应该可见。这适用于Project Explorer,但不适用于我的表视图。

我认为问题是所选元素的类型。 插件间谍在我的表视图中显示以下内容: 所选元素的类型:Collection$Member, 对所选元素有效的接口:IAdaptable 而Project Explorer分别显示FileIFile

我的适配器通常工作,并在从未知的Eclipse源触发时传递相关的IFile。 我想我必须明确地说,上下文菜单应该使用IFile类型来获取正确的菜单条目,但我不知道如何。 或者我错过了什么?

1 个答案:

答案 0 :(得分:0)

没有真正的'默认'菜单。某些菜单项被定义为添加到定义特定占位符的所有弹出菜单中。

要使用占位符,您必须使用Eclipse注册上下文菜单,例如:

private void createContextMenu(Viewer viewer) {
    Control menuControl = viewer.getControl();
    MenuManager menuMgr = new MenuManager("#PopUp"); 
    menuMgr.setRemoveAllWhenShown(true);
    menuMgr.addMenuListener(new IMenuListener() {
        @Override
        public void menuAboutToShow(IMenuManager mgr) {
            fillContextMenu(mgr);
        }
    });
    Menu menu = menuMgr.createContextMenu(menuControl);
    menuControl.setMenu(menu);

    // register the context menu such that other plugins may contribute to it
    getSite().registerContextMenu(menuMgr, viewer);
}

private void fillContextMenu(IMenuManager menu) {
    // TODO add your actions

    // Standard additions
    menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}

您可能还需要将查看器设置为“选择提供者”:

getSite().setSelectionProvider(viewer);

许多菜单项会检查此项以查看当前选择的类型。

没有任何内容可以自动为您提供“打开方式”或“删除”等内容,您必须自己在“fillContextMenu”部分添加这些内容。

您可以使用org.eclipse.ui.actions.OpenWithMenu打开方式。

IFile file = ... currently selected file

IMenuManager submenu = new MenuManager("Open With...");
submenu.add(new OpenWithMenu(getSite().getPage(), file);
menu.append(submenu);