Eclipse插件(RCP)CND自定义导航按需引用Eclipse已实现的功能菜单

本文介绍了如何在基于CommonNavigatorFramework的Eclipse插件中扩展导航菜单,添加新建、编辑和删除操作。通过引用Eclipse内置的EditActionProvider和创建定制的NewActionProvider,实现了文件资源管理中的常见操作。新建组仅包含File和Folder,编辑组包含了复制、粘贴和删除功能,避免了不必要的子菜单。详细步骤包括在popupMenu中插入组,定义actionProvider并在plugin.xml中配置enablement。同时,定义了文件和文件夹的新建向导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Common Navigator Framework 实践(二)菜单扩展中实现了对自定义导航菜单,菜单中基本使用了自定义菜单项,对于一个面向文件资源管理的导航,资源的新建、复制、粘贴、删除等操作是很常见的,但是现在的导航却没有。

目标

给自定义导航添加新建、复制、粘贴、删除等常见操作。

分析

Eclipse 原本是支持这些操作的,也就是它以前已经做了实现,因此可以直接引用那些实现。

引用有多种方式,可以按需使用

  1. 在自定义的ActionProvider 中引用类,通过代码的方式使用已实现功能。这种方式比较灵活,也比较容易实现,也容易个性化扩展。
  2. 在plugin.xml 中引用,这种引用是指重新定义一个ActionProvider,其class属性值填Eclipse中已实现的类的全路径,ID写一个自己项目的全新唯一ID。这种方式适合与业务需求与Eclipse实现完全一致的情况,比较少。
  3. 在plugin.xml中重新定义一个ActionProvider,通过复制精简、继承、属性引用等方式创造一个新的类,并以这个类作为class属性。这种方式适合对Eclipse提供的功能需要增减的情况,目的就是为了少造轮子。

以下将采用后面的两种方式实现本文目标。

实现

一、编辑组(复制、粘贴、删除)

在Eclipse中有一个group.edit组,包含复制、粘贴、删除操作,其实现类是org.eclipse.ui.internal.navigator.resources.actions.EditActionProvider

使用第二种方式实现该功能。

1 在popupMenu中添加组<insertionPoint name="group.edit" separator="true"/>
2 在扩展点org.eclipse.ui.navigator.navigatorContent下新建actionProvider,其class属性使用org.eclipse.ui.internal.navigator.resources.actions.EditActionProvider,id取值为com.xzbd.actions.EditActions

      <!-- 编辑按钮组 -->
      <actionProvider
              class="org.eclipse.ui.internal.navigator.resources.actions.EditActionProvider"
              id="com.xzbd.actions.EditActions">
			<enablement>
			    <or>
	              <instanceof value="org.eclipse.core.resources.IResource" /> 
	              <instanceof value="org.eclipse.core.resources.IFolder" />
	              <instanceof value="org.eclipse.core.resources.IFile" /> 
			    </or>
          </enablement>              
      </actionProvider>

二、新建组

Eclipse 原生新建组包含Project、File、Folder、Example、Other…等子菜单。
在这里插入图片描述
现设定新建组只需要File和Folder。
这种情况适合第三种扩展方法。Eclipse 提供的新建组内容比较多,因此需要精简。可以通过复制这个类的副本,并去掉其中不要的内容,只保留文件夹和文件的新建功能即可。

1 在popupMenu中添加组<insertionPoint name="group.new" separator="true"/>

2 在扩展点org.eclipse.ui.navigator.navigatorContent下新建actionProvider,其内容如下。

      <!-- 新建按钮组 -->
      <actionProvider
            	class="com.xzbd.navigator.provider.NewActionProvider"
            	id="com.xzbd.actions.NewActions">
        	<enablement>
        			<or>
						<adapt type="org.eclipse.core.resources.IResource" />
						<adapt type="java.util.Collection">
							<count value="0" />
						</adapt>
					</or>
	         </enablement>
		</actionProvider>

3 类com.xzbd.navigator.provider.NewActionProvider 的代码

package com.xzbd.navigator.provider;


import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.navigator.resources.plugin.WorkbenchNavigatorMessages;
import org.eclipse.ui.navigator.CommonActionProvider;
import org.eclipse.ui.navigator.ICommonActionExtensionSite;
import org.eclipse.ui.navigator.ICommonMenuConstants;
import org.eclipse.ui.navigator.ICommonViewerWorkbenchSite;
import org.eclipse.ui.navigator.WizardActionGroup;

/**
 * Provides the new (artifact creation) menu options for a context menu.
 *
 * <p>
 * The added submenu has the following structure
 * </p>
 *
 * <ul>
 * <li>a new generic project wizard shortcut action, </li>
 * <li>a separator, </li>
 * <li>a set of context senstive wizard shortcuts (as defined by
 * <b>org.eclipse.ui.navigator.commonWizard</b>), </li>
 * <li>another separator, </li>
 * <li>a generic examples wizard shortcut action, and finally </li>
 * <li>a generic "Other" new wizard shortcut action</li>
 * </ul>
 *
 * @since 3.2
 *
 */
@SuppressWarnings("restriction")
public class NewActionProvider extends CommonActionProvider {


	private static final String NEW_MENU_NAME = "common.new.menu";//$NON-NLS-1$


	private WizardActionGroup newWizardActionGroup;

	private boolean contribute = false;

	@Override
	public void init(ICommonActionExtensionSite anExtensionSite) {

		if (anExtensionSite.getViewSite() instanceof ICommonViewerWorkbenchSite) {
			IWorkbenchWindow window = ((ICommonViewerWorkbenchSite) anExtensionSite.getViewSite()).getWorkbenchWindow();

			newWizardActionGroup = new WizardActionGroup(window, PlatformUI.getWorkbench().getNewWizardRegistry(), WizardActionGroup.TYPE_NEW, anExtensionSite.getContentService());

			contribute = true;
		}
	}

	/**
	 * Adds a submenu to the given menu with the name "group.new" see
	 * {@link ICommonMenuConstants#GROUP_NEW}). The submenu contains the following structure:
	 *
	 * <ul>
	 * <li>a new generic project wizard shortcut action, </li>
	 * <li>a separator, </li>
	 * <li>a set of context senstive wizard shortcuts (as defined by
	 * <b>org.eclipse.ui.navigator.commonWizard</b>), </li>
	 * <li>another separator, </li>
	 * <li>a generic examples wizard shortcut action, and finally </li>
	 * <li>a generic "Other" new wizard shortcut action</li>
	 * </ul>
	 */
	@Override
	public void fillContextMenu(IMenuManager menu) {
		IMenuManager submenu = new MenuManager(
				WorkbenchNavigatorMessages.NewActionProvider_NewMenu_label,
				NEW_MENU_NAME);
		if(!contribute) {
			return;
		}
		// fill the menu from the commonWizard contributions
		newWizardActionGroup.setContext(getContext());
		newWizardActionGroup.fillContextMenu(submenu);

		submenu.add(new Separator(ICommonMenuConstants.GROUP_ADDITIONS));

		// append the submenu after the GROUP_NEW group.
		menu.insertAfter(ICommonMenuConstants.GROUP_NEW, submenu);
	}

}

4 定义文件、文件夹新建向导

<commonWizard
	 type="new"
	 wizardId="org.eclipse.ui.wizards.new.folder">
	 <enablement>
		<or>
			<adapt type="org.eclipse.core.resources.IFile" />
			<adapt type="org.eclipse.core.resources.IFolder" />
	        <adapt type="org.eclipse.core.resources.IProject" />
	        <adapt type="org.eclipse.core.resources.IWorkspaceRoot" />
		</or>
      </enablement>
</commonWizard>
<commonWizard
	type="new"
    wizardId="org.eclipse.ui.wizards.new.file">
	<enablement>
		<or>
			<adapt type="org.eclipse.core.resources.IFile" />
			<adapt type="org.eclipse.core.resources.IFolder" />
        	<adapt type="org.eclipse.core.resources.IProject" />
            <adapt type="org.eclipse.core.resources.IWorkspaceRoot" />
		</or>
     </enablement>
</commonWizard>

注意

  • 以上依然拷贝自Eclipse的实现。
  • 这属性commonWizard功能实现,如果业务需要其他新建向导功能加到group.new组,可以仿照以上两个实现。
  • 如果viewerContentBinding中包含了org.eclipse.ui.navigator.resourceContent ,则以上定义可以不用重写。

因为刚定义的两个ActionProvider的ID刚好都满足 com.xzbd.actions.* 表达式,因此它们其实已经绑定到 导航视图。

效果展示

启动运行,效果如下
在这里插入图片描述
上图中增加了新建菜单组New(File、Folder),及编辑组(Copy、Paste、Delete)。可以发现新建组中没有 Project、Examples 、Other等子菜单项。

系列文章

CNF系列汇总
Common Navigator Framework 实践(一)自定义导航
Common Navigator Framework 实践(二)菜单扩展
Common Navigator Framework 实践(三)文件拖拽控制
Common Navigator Framework 实践(四)文件过滤
Common Navigator Framework 实践(五)菜单及工具条定制

目 录 1.富客户端平台 1 1.1.概述 1 1.2.Eclipse RCP 建设风格——插件,扩展和扩展点 1 2.创建你的第一个RCP程序 1 2.1.创建一个RCP程序 2 2.2.启动你的RCP程序 5 2.3.应用程序VS 产品 6 3.应用程序里的插件ID 7 4.Actions的用法(菜单和工具栏) 7 4.1.概述 7 4.2.通过编码添加 8 4.3.由“扩展”方式向程序添加菜单和工具栏 11 5.添加组合键 19 5.1.概述 19 5.2.声明actions的组合键 19 6.系统托盘 24 7.外观 30 7.1.向程序中添加视图模板 31 7.2.向应用程序添加VIEW 36 7.3.向VIEW里添加action 40 8.和编辑器一起工作 51 8.1.概述 51 8.2.创建工程 51 8.3.创建并准备domain 模型 51 8.4.在视口中使用domain模型 57 8.5.加入编辑器 58 8.6.调用编辑器 66 8.7.向编辑器提供内容 70 9.对话框 71 9.1概述 71 9.2.预定义的对话框 71 9.2.1.概述 71 9.2.2.创建工程 71 9.2.3.声明action 71 9.2.4.调用对话框 71 9.3.用户自定义对话框 74 9.3.1.概述 74 9.3.2.创建工程 74 9.3.3.声明action 74 9.3.4.声明action 74 9.3.5.创建对话框 75 10.向导(wizard) 77 10.1.概述 77 10.2.例子 77 11.首选项 85 11.1 首选项 85 11.2.使用首选项 85 11.3.首选项页 91 12.添加状态条 97 12.1.安装状态条 97 12.2.共享状态条 98 13.透视 103 13.1.向你的程序中添加透视图 103 13.2.使透视图可选。 107 13.2.1.使透视图可由一个coolbar可选 107 13.2.2.使透视图可通过菜单选择。 109 14.进度报告 112 15.将外部类包含进你的程序 118 15.1.概述 118 15.2.向构建路径中添加jar 118 15.3.使jar在你的运行路径里有效 119 16.提示和策略 120 16.1.控制台日志 120 16.2.保存用户的布局 121 16.3.获得display 122 16.4.使用eclipse的“保存”action 123 16.5.装载模型 127 16.6.向你的程序添加错误日志视口 127 17.制造一个产品 129 17.1.概述 129 17.2.创建一个工程 130 17.3.测试你的产品 134 18.商标 134 18.1.欢迎页面 134 18.2.商标 135 18.3.风格化launcher 136 19.发布你的产品 137 20.发布引入外部jar的产品 141 20.1.整合外部jar和第三方库 141 Tip 142 21.1.创建一个新工程 144 21.2.创建一个产品 144 21.3.添加依赖性 145 21.4.向程序中添加action 146 21.5.创建一个帮助插件工程////原著写的不好 149 22.附录:配置文件 152 22.1.概述 152 22.2..project 153 22.3.Manifest.MF 154 23.附录:使用接口技术 154 23.2.Jface 154
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值