可扩展体系结构的研究(六)--condition的概述
例子
我们可能会扩展我们应用程序的主菜单,添加一个水平排列,垂直排列等等的菜单选项,但是我们可能会有不同版本的windows工作区,像多文档的,浮动窗体的或是单文档的需要不同的对待。
当我们有单文档工作区为活动时,我们可能不希望控制布局的菜单项显示。
可以像下面的例子这样处理(只有条件满足,才执行):
<Conditional string="${property:NCvs.Gui.Workspace}" equals="MDI">
<MenuItem id = "Window" label = "&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 = "&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 = "&Update"
class = "NCvsRepositoryView.Commands.UpdateCommand"/>
<MenuItem id = "Commit"
label = "&Commit"
class = "NCvsRepositoryView.Commands.CommitCommand"/>
</Conditional>
<MenuItem id = "Separator1" label = "-"/>
<MenuItem id = "Import"
label = "&Import"
class = "NCvsLocalView.Commands.ImportCommand"/>
</Conditional>
这个菜单只有当所有者的状态是RepositorySelected和FolderSelected时是活动的,而且菜单项update和commit时只有在RepositorySelected状态下是活动的。嵌套条件的action属性像一般条件属性节点的定义方式一样。
操作符< And/ >, < Or/ > and < Not/ >是被定义好的。操作符是不能再被插件扩展的,和新定义好了合法的操作符。
注:复杂条件节点也可能只包含一个项。