本节介绍根据CNF框架自定义导航。
分析
此处我们**约定:**Epx的导航和Eclipse的导航一样,是一种基于文件资源的树形导航(CNF最适合做这类导航)。
若需要非文件资源的导航,而是一些类web功能集的菜单导航或者功能集的树形导航,并且需要每个功能菜单的右键菜单都不一致,或没有功能菜单。那么CNF可能不太适合做这样的业务,读者可以自己定义一个视图,根据业务实现自己的导航需要,然后此视图置为导航视图。
导入插件
如图引入插件org.eclipse.ui.ide
,org.eclipse.ui.navigator
,org.eclipse.ui.navigator.resource
扩展视图
- 从
org.eclipse.ui.views
扩展视图 导航栏
<!-- 视图 -->
<extension
point="org.eclipse.ui.views">
<view
class="com.xzbd.navigator.MainNavigator"
id="com.xzbd.views.MainNavigator"
name="导航栏"
restorable="true">
</view>
</extension>
- 实现
com.xzbd.navigator.MainNavigator
,使其继承CommonNavigator
public class MainNavigator extends CommonNavigator {
public static final String ID = "com.xzbd.views.MainNavigator";
}
注意:
为了方便管理,约定实现类中定义该视图的ID,plugin.xml 中引用该ID的值
丰富导航栏视图
定义得导航视图现在什么都没有,我们得给他添加资源。依照约定,导航中的资源与Eclipse中的资源一致。
- 扩展
org.eclipse.ui.navigator.viewer
扩展点org.eclipse.ui.navigator.viewer
是CNF视图扩展的入口,
viewer
表示导航使用的视图,viewerId
绑定到导航栏ID即可viewerContentBinding
表示视图中展现的资源有哪些,可以通过incloud
和excloud
指定包含或者排除哪些资源。一般情况下我们使用Eclipse已经定义好的资源就以足够。如<contentExtension pattern="org.eclipse.ui.navigator.resourceContent" />
,该资源是在org.eclipse.ui.navigator.resource
实现的。当然您可以不适用它,而直接使用自己定义的资源<contentExtension pattern="main-navigator-content.navigator-content"" />
viewerActionBinding
表示视图中的资源选中后的右击菜单。
示例配置如下:
<extension
point="org.eclipse.ui.navigator.viewer">
<viewer viewerId="com.xzbd.views.MainNavigator"> </viewer>
<viewerContentBinding viewerId="com.xzbd.views.MainNavigator">
<includes>
<contentExtension pattern="org.eclipse.ui.navigator.resourceContent" />
<contentExtension pattern="org.eclipse.ui.navigator.resources.filters.*"/>
</includes>
</viewerContentBinding>
<viewerActionBinding viewerId="com.xzbd.views.MainNavigator">
<includes>
<actionExtension pattern="org.eclipse.ui.navigator.resources.*"/>
</includes>
</viewerActionBinding>
</extension>
- 扩展
org.eclipse.ui.navigator.navigatorContent
org.eclipse.ui.navigator.navigatorContent
表示扩展导航内容
id
表示改内容的唯一编号name
表示资源的名称labelProvider
表示资源的展示,用于定义颜色、大小、图片、文字、特效等contentProvider
表示资源内容,用于定义那些资源可以被展示,及如何查找资源的父、子资源。possibleChildren
表示导航中可能的资源类型
<extension
point="org.eclipse.ui.navigator.navigatorContent">
<navigatorContent
activeByDefault="true"
id="main-navigator-content.navigator-content"
name="mainNavigatorContent"
labelProvider="com.xzbd.navigator.provider.MainLabelProvider"
contentProvider="com.xzbd.navigator.provider.MainContentProvider"
priority="normal">
<triggerPoints>
<or>
<and>
<instanceof value="org.eclipse.core.resources.IResource"/>
<test
forcePluginActivation="true"
property="org.eclipse.core.resources.extension"
value="properties"/>
</and>
</or>
</triggerPoints>
<possibleChildren>
<or>
<instanceof value="org.eclipse.core.resources.IWorkspaceRoot" />
<instanceof value="org.eclipse.core.resources.IProject" />
<instanceof value="org.eclipse.core.resources.IResource" />
<instanceof value="org.eclipse.core.resources.IFolder" />
<instanceof value="org.eclipse.core.resources.IFile" />
</or>
</possibleChildren>
</navigatorContent>
</extension>
labelProvider
实现
package com.xzbd.navigator.provider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
public class MainLabelProvider extends WorkbenchLabelProvider {
}
我们定义的MainLabelProvider
继承自WorkbenchLabelProvider
,很容易发现没有做任何实现,因此我们其实在plugin.xml 中直接使用org.eclipse.ui.model.WorkbenchLabelProvider
或其他类似的类
contentProvider
实现
package com.xzbd.navigator.provider;
import org.eclipse.ui.model.WorkbenchContentProvider;
public class MainContentProvider extends WorkbenchContentProvider {
}
contentProvider 实现类与labelProvider同理。
适配
最后一点,因为我们实现的是类似于Eclipse的资源导航,所以我们需要做一下IDE适配。
很简单,在ApplicationWorkbenchAdvisor
的initialize
方法中适配即可,如果需要设置根项目的展示图片,可以配置IDE.SharedImages.IMG_OBJ_PROJECT
,代码如下:
@Override
public void initialize(IWorkbenchConfigurer configurer) {
// // 配置 project 默认图标
// configurer.declareImage(IDE.SharedImages.IMG_OBJ_PROJECT,
// AppActivator.getImageDescriptor(ContentSystemImg.PROJECT_IMG), true);
// 初始化
super.initialize(configurer);
// IDE适配
IDE.registerAdapters();
}
运行效果
其中项目testProject01和testProject02初始化创建见文章
Eclipse插件(RCP)初始化资源文件
系列文章
[CNF系列汇总](https://blog.csdn.net/m0_4740683
2/article/details/123890933)
Common Navigator Framework 实践(一)自定义导航
Common Navigator Framework 实践(二)菜单扩展
Common Navigator Framework 实践(三)文件拖拽控制
Common Navigator Framework 实践(四)文件过滤
Common Navigator Framework 实践(五)菜单及工具条定制