可扩展体系结构的研究(六)--condition的概述

        值得注意的是:一些菜单项仅仅是在他们活动的状态下或是当指定的插件被安装了才显示。而在另一方面,我们可能会想在某些事物不在活动状态时将菜单项制为不可用。在这种情况下,条件就被引入到插件结构中。条件是一种非常一般的概念。它可以运用在除菜单项以外的其他应用场景。

例子

   我们可能会扩展我们应用程序的主菜单,添加一个水平排列,垂直排列等等的菜单选项,但是我们可能会有不同版本的windows工作区,像多文档的,浮动窗体的或是单文档的需要不同的对待。

    当我们有单文档工作区为活动时,我们可能不希望控制布局的菜单项显示。

    可以像下面的例子这样处理(只有条件满足,才执行):

<Conditional string="${property:NCvs.Gui.Workspace}" equals="MDI">

<MenuItem id = "Window" label = "&amp;Window">

<MenuItem id = "TileH" label = "Tile horizontal"/>

<MenuItem id = "TileV" label = "Tile vertical"/>

<MenuItem id = "Cascade" label = "Cascade"/>

</MenuItem>

</Conditional>

    在这种情况下,整个菜单从菜单栏中去掉。但另一种有用的情况,当多文档窗口是活动的,但是没有一个子窗体是打开的,在window菜单中的动作同样不能执行。大多数程序不会去掉这样的动作,而只是将这些菜单项的响应制灰。

    在这种情况下,会有以下的这个例子(首先如果是多文档的工作区,则会执行下面的程序,如果没有一个多文档窗口是活动的,那么是下面的菜单项不可用):

<Conditional string="${property:NCvs.Gui.Workspace}" equals="MDI">

<MenuItem id = "Window" label = "&amp;Window">

<Conditional activemdi="*" action="Disable">

<MenuItem id = "TileH" label = "Tile horizontally"/>

<MenuItem id = "TileV" label = "Tile vertically"/>

<MenuItem id = "Cascade" label = "Cascade"/>

</Conditional>

</MenuItem>

</Conditional>

    这可能不是我们需要的最特别的条件,因此条件再扩展codon时被需要。

必要的属性

   正如你所看到的,条件节点并没有像codon那样有不同的名字。

    那么条件节点怎么互相区分呢。

    答案是:他们拥有的必要属性全集是不同的。他们可能有相同的必要属性,但是每个条件的必要属性集合必须是唯一的。

    注:不能有两个有相同属性记的条件被定义.     

复杂条件

    条件可能会嵌套。我们可以使用子条件的方式来逻辑上的包含条件,但是当我们想一个条件用or来匹配另一个时我们怎么做?一种可行的方式是像if-else结构那样写两个条件节点,但是这种方式的问题在我们想否定一个条件时变得很明显,我们至今还没有用来条件否定的工具。为了使条件处理变得简单一点,有一种解决方案:将多个条件包含在一个项里面。

    我们如下定义一个项:

< Condition/ >

< Or > term1, term2, · · · , termn < /Or >

< And > term1, term2, · · · , termn < /And >

< Not > term < /Not >

    这是一个包含条件的最小的操作集合。可能更多的逻辑操作符会在今后被添加。

    在xml,复杂条件项会看起来像下面这样:

 <Conditional>

<Or>

<Condition ownerstate="RepositorySelected"/>

<Condition ownerstate="FolderSelected"/>

</Or>

<Conditional ownerstate="RepositorySelected" action="Disable">

<MenuItem id = "Update"

label = "&amp;Update"

class = "NCvsRepositoryView.Commands.UpdateCommand"/>

<MenuItem id = "Commit"

label = "&amp;Commit"

class = "NCvsRepositoryView.Commands.CommitCommand"/>

</Conditional>

<MenuItem id = "Separator1" label = "-"/>

<MenuItem id = "Import"

label = "&amp;Import"

class = "NCvsLocalView.Commands.ImportCommand"/>

</Conditional>

这个菜单只有当所有者的状态是RepositorySelected和FolderSelected时是活动的,而且菜单项update和commit时只有在RepositorySelected状态下是活动的。嵌套条件的action属性像一般条件属性节点的定义方式一样。

    操作符< And/ >, < Or/ > and < Not/ >是被定义好的。操作符是不能再被插件扩展的,和新定义好了合法的操作符。

    注:复杂条件节点也可能只包含一个项。

posted on 2005-08-27 14:46  栖息的熊  阅读(641)  评论(0编辑  收藏  举报

导航