我正在编写一个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>
显示自定义SWT菜单没问题,但我认为正确的方法是使用Eclipse菜单结构,特别是通过为Resources提供默认行为。 如何通过在我的SWT TableView中右键单击Project Explorer中的资源来显示默认上下文弹出菜单?
编辑第二个问题已删除
EDIT2 根据greg-449的回答,问题仍然是上下文菜单显示我不希望这种类型的选择有条目。 F.E.我需要删除或打开或类似'文件基础'之类的东西,而不是我自己实现它。
我们还有一些来自其他插件的菜单,这些菜单在选择适当的文件类型时应该可见。这适用于Project Explorer,但不适用于我的表视图。
我认为问题是所选元素的类型。
插件间谍在我的表视图中显示以下内容:
所选元素的类型:Collection$Member
,
对所选元素有效的接口:IAdaptable
而Project Explorer分别显示File
和IFile
。
我的适配器通常工作,并在从未知的Eclipse源触发时传递相关的IFile
。
我想我必须明确地说,上下文菜单应该使用IFile
类型来获取正确的菜单条目,但我不知道如何。
或者我错过了什么?
答案 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);