定义自己的Common Navigator三

时间:2022-11-27 07:44:41

OK,我们已经有了一个初步可运行的Navigator了,现在它看起来已经比较丰富了。不过我们在xml文件下的任意结点上点右键时,都没有菜单显示。另外假如我们有一个新的wizard,我们也想像javapackage explorer视图一样显示在new菜单的那一层。那我们应该怎么做呢?这一节就来介绍这部分的实现。

 

实际上,从上面的介绍里,很多人可能都已经知道了怎么完成这些事情。不过这里还是写一个完整的介绍过程。

 

先说一下我们的目标:在IResource对象的new菜单里,加上java project wizard。在xml文件的node上,加一个菜单用来显示它的所有属性。

 

首先我们完成第一件事。

 

增加快捷Wizard

第二节中,我们提到过,在org.eclipse.ui.navigator.navigatorContent扩展点的navigatorContent里也有两个子扩展:commonWizardactionProvider

这里要加一个wizard的快捷方式,就是需要扩展这个commonWizard。所以在上面我们扩展的navigatorContent里,我们再声明子扩展:commonWizard。如下:

         <commonWizard

               type="new"

               wizardId="org.eclipse.jdt.ui.wizards.JavaProjectWizard">

            <enablement>

               <instanceof

                     value="org.eclipse.core.resources.IResource">

               </instanceof>

            </enablement>

         </commonWizard>

 

有三种类型的wizard,这里我们选择new;然后就是指定wizardId,这里我们指定为java project wizardID;最后就是定义出现在条件,这里定义的条件就是如果选择的对象为IResource对象,则出现。

最后我们的图如下:

 

定义自己的Common Navigator三

图九

 

显然你可以很简易的推到其他两种类型wizard的快捷定义。

 

增加自定义菜单

现在看我们的XML下的那些结点,点右键时没有菜单显示。这里我们就给他们加一个显示值的菜单。

要实现自定义菜单,我们就需要扩展和上面的commonWizard在同一级的actionProvider。先看一下我们的声明:

        <actionProvider

               class="com.tibco.cdc.liugang.navigator.actions.LiugangCommonActionProvider"

               id="com.tibco.cdc.liugang.navigator.navigatorContent.actions">

            <enablement>

               <instanceof

                     value="org.w3c.dom.Node">

               </instanceof>

            </enablement>

         </actionProvider>

 

这里有五个属性定义,不过我们需要关心的只有上面两个:class用来定义实现类;id唯一标识这个actionProvider。然后我们加了一个可用的约束条件:选择的对象需要是一个Node实例。

 

定义完actionProvider之后,我们就要注册这个actionProvider了。在我们的viewer扩展的viewerActionBindingincludes下面加一句就行了:

 

<actionExtension              pattern="com.tibco.cdc.liugang.navigator.navigatorContent.actions">

</actionExtension>

 

好,接下来我们先完成实现类,如下:

public class LiugangCommonActionProvider extends CommonActionProvider {

 

  private Action propertyAction;

  private ICommonViewerSite viewSite;

 

  public LiugangCommonActionProvider() {

  }

 

  @Override

  public void init(ICommonActionExtensionSite site) {

         super.init(site);

         viewSite = site.getViewSite();

         propertyAction = new Action("Show Property") {

               @Override

               public void run() {

                      IStructuredSelection selection = (IStructuredSelection) viewSite

                                    .getSelectionProvider().getSelection();

                      Object firstElement = selection.getFirstElement();

                      if (firstElement instanceof Node) {

                             Node selectedNode = (Node) firstElement;

                             MessageDialog.openInformation(viewSite.getShell(),

                                           "Property", getAllAttributes(selectedNode));

                      }

               }

         };

  }

 

  @Override

  public void fillContextMenu(IMenuManager menu) {

         menu.add(propertyAction);

  }

 

  private String getAllAttributes(Node node) {

         NamedNodeMap attributes = node.getAttributes();

         String content = "<";

         for (int i = 0; i < attributes.getLength(); i++) {

               Node item = attributes.item(i);

               content += item.getNodeName() + "=" + item.getNodeValue() + " ";

         }

         content += ">";

         return content;

  }

}

 

看起来像是我们已经完成了所有的过程。不过如果此时我们在node上点右键的话,并不出现右键菜单。为什么呢?

 

这里我们需要提到另一个扩展元素:possibleChildren。它和triggerPoints在同一层。

这个扩展元素指出我们的内容扩展中的哪些结点类型可以指供labelparent。如果你要实现editor link或者是想使得setSelection()方法可用,则必须提供这个扩展元素的声明。

 

这里,对应于我们点右键菜单,显然我们应该使得setSelection()方法可用,这样才能知道我们在资源树上选择了哪个node结点,最后传到我们的actionProvider的实现。完成我们的右键菜单。这里我们可以如下声明:

         <possibleChildren>

            <or>

               <instanceof

                     value="org.w3c.dom.Node">

               </instanceof>

            </or>

         </possibleChildren>

最后效果如下:

 

定义自己的Common Navigator三