深入 Common Navigator Framework 之 Action Providers

6.1 概述

有了工程的树形结构显示,自然就要考虑到菜单的配置了。对于Eclipse的Project Explorer来说,功能丰富的右键菜单是必不可少了,对于右键菜单来说,每个触发对象(节点)不同,引发的操作也不同。而且各个节点上的菜单也会有所区别,比如文件和文件夹。


Eclipse使用pop menu进行右键菜单的添加,CNF将其封装为Action Provider,通过Action Provider用户可以方便的为不同的节点创建不同的右键菜单。

 

6.2 扩展点

扩展点org.eclipse.ui.navigator.navigatorContent/actionProvider用来声明Action Provider。

 


 
定义好的Action Provider将在org.eclipse.ui.navigator.viewer/viewerActionBinding引用。
下面是两个重要的属性:

6.2.1 class属性

这里指定的必须继承类org.eclipse.ui.navigator.CommonActionProvider,它提供了显示在右键中的菜单。

 

6.2.2 id属性

在org.eclipse.ui.navigator.viewer/viewerActionBinding中通过ID引用别处定义的Action Provider,所以ID一定要指定,而且要唯一。

 

6.3 Eclipse实现

Eclipse提供了很多的Action Provider实现,比如上面提到的OpenActionProvider,下面我们看看到底是如何实现的。
定义如下:

<actionProvider
                  id="org.eclipse.ui.navigator.resources.OpenActions"
                class="org.eclipse.ui.internal.navigator.resources.actions.OpenActionProvider">
            <enablement>
                <or>
                    <adapt type="org.eclipse.core.resources.IFile" />    
                </or>
            </enablement>
        </actionProvider>
 

类GoIntoActionProvider 的实现也比较简单,就是将GoIntoAction显示在菜单中。

 

public class GoIntoActionProvider extends CommonActionProvider {

    private GoIntoAction goIntoAction;

    public void init(ICommonActionExtensionSite anActionSite) {
        anActionSite.getViewSite().getShell();
        CommonViewer viewer = (CommonViewer) anActionSite.getStructuredViewer();
        goIntoAction = new GoIntoAction(viewer.getFrameList());
    }

    public void dispose() {
        goIntoAction.dispose();
    }

    public void fillActionBars(IActionBars actionBars) {
        actionBars.setGlobalActionHandler(IWorkbenchActionConstants.GO_INTO, goIntoAction);
    }

    public void fillContextMenu(IMenuManager menu) {
        menu.appendToGroup("group.new", goIntoAction); //$NON-NLS-1$
    }

    public void updateActionBars() {
        goIntoAction.update();
    }

}
 


最后看看如何通过ID引用这个Action Provider,在org.eclipse.ui.navigator.viewer中有,给视图org.eclipse.ui.navigator.ProjectExplorer添加viewerActionBinding:

<viewerActionBinding
            viewerId="org.eclipse.ui.navigator.ProjectExplorer">
         <includes>
             <actionExtension pattern="org.eclipse.ui.navigator.resources.*" />
         </includes>
       </viewerActionBinding>
 

这里使用了正则匹配“org.eclipse.ui.navigator.resources.* ”来引用所有ID以org.eclipse.ui.navigator.resources开始的Action Provider。

 

6.4 说明

如果去看看org.eclipse.ui.navigator.resources中的扩展点定义,会发现Action Provider会在两个地方定义,一个位于navigatorContent里面,作为子节点,一个是位于nivagatorContent平级,作为兄弟节点。这两个地方定义的Action Provider功能上一样,区别在于,位于navigatorContent里面的Action Provider将自动激活,而另一种情况下,必须显示使用viewerActionBinding进行引用才会激活。


如此设计是为了在navigatorContent之间Action Provider的重用,类似的,Common Filter、Common Wizard也一样。

 


你可能感兴趣的:(eclipse,cnf)