rcp(插件开发)扩展点逻辑

在扩展点中,我们进场能够看到一些表达式:
 
 
 
 
 


Xml代码 
1.<enabledWhen> 
2.            <with 
3.                  variable="activeEditor"> 
4.               <test 
5.                     property="org.gsbp.ide.common.ui.editor.dirty"> 
6.               </test> 
7.            </with> 
8. </enabledWhen> 
 
 如上就是一段用于判断菜单是否可用的表达式。
 
 
 
扩展点里面使用表达式的功能主要存在于org.eclips.core.expression插件中
 
 
 
如下是表达式中常见的逻辑:
 
not  用来对表达式运行结果取反 
and  用来在多个表达式之间进行与运算,只有多个表达式都为true的时候,才会返回true,否则返回false 
or  用来在多个表达式之间进行或运算,只有多个表达式都为false的时候,才会返回false,否则返回true 
instanceof  用来判断指定的对象是否是指定类或者接口的实例 
systemTest  用来比较System系统变量中的值是否与指定值相等 
iterate  用来处理java.util.Collection的所有子对象 
equals  用来判断指定对象与预先设置的数据是否相等 
count  用来处理java.util.Collection的集合大小 
with   
resolve   
adapt  用来将选中对象转成预先指定的对象,以便更灵活的处理 
test    基于最重要的人物总是最后出场的原则,将adapt和test放在最后进行说明。 
 
 
 
 
 
not
not本身并没有具体的信息,只是将其子表达式的结果进行取反。通常的配置如下:


 


Java代码 
1.<not> 
2.   <instanceof value="org.eclipse.core.resources.IFile"/> 
3.</not>   
 
 
 
如果选中的对象不是文件,会返回true,因为not将instanceof的结果取反。
 
 
 
 
 
and
 
与not功能相类似,and是将所有的子结点结果进行与运算
 
 
 

 


Java代码 
1.<and> 
2.   <instanceof value="org.eclipse.core.resources.IFile"/> 
3.   <test property="org.demo.matchesPattern" value="*.html"/> 
4.</and>   
 
 只有选中的对象是文件,而且名称符合*.html才会返回true。
 
 
 
 
 
 
 
or
 
与not功能相类似,and是将所有的子结点结果进行与运算
 
 
 


Java代码 
1.<or> 
2.   <instanceof value="org.eclipse.core.resources.IFolder"/> 
3.   <instanceof value="org.eclipse.core.resources.IProject"/> 
4.</or>  
 
  只有选中的对象是目录或者是项目,就会返回true,如果是文件,就会返回false。 
 
 
 
 
 
instanceof
 
用来判断指定的对象是否是指定类或者接口的实例
 
 
 

 


Java代码 
1.<instanceof value="org.eclipse.core.resources.IFile"/>   
 
 只有选中的对象是文件的实例时,如org.eclipse.core.resource.internal.File时,才会返回true. 
 
 
 
 
 
 
 
systemTest
 
用来比较System系统变量中的值是否与指定值相等,它会调用System.getProperty("xxx")方法取得系统变量值,,并将该值与指定值进行比较。
 
 
 
 
 


Java代码 
1.<systemTest property="encoding" value="GB2312"/>  
 
 那么该配置只有当前JVM的默认编码为GB2312(即中文时),才会返回true.
 
 
 
 
 
iterate
 
iterate是一个非常少用的属性,它主要用来处理java.util.Collection中子元素的内容。它会逐渐遍历集合的所有子元素,然后再将每个子元素放入子表达式中进行计算,其实operator有or和and两种可选,是用来支持子表达的或运算和与运算,与前面的or和and相似。
 
 
 
 
 


Java代码 
1.<iterate operator="or"> 
2.         <instanceof value="org.eclipse.core.resources.IFile"/> 
3.</iterate> 
 
 
 
 
 
equals
 
在配置文件中,其实只有一种字符串数据类型,而在Java中的数据类型丰富的多,因此Eclipse提供了一整套的转换机制,用来将字符串转成相应的Java类型,下面是相应的转换规则:1. 对于字符串"true",将会转成Boolean.TRUE2. 对于字符串"false",将会转成Boolean.FALSE3. 如果字符串中有小数点,将会转成浮点数Float4. 如果字符串中只有数字,就会转成整数Integer5. 如果以上的转换出现错误,或者不符合以上情况,就会转成字符串6. 如果希望使用字符串true,或者1.2之类的数据,而不被转成Boolean.True和相应的Float,就使用单绰号',如"''true",就会转成"true",而不是Boolean.True
 
 
 
 
 


Java代码 
1.<equals value="100"/>   
 
 
 
 
 
count
 
用来验证一个java.util.Collection中的size是否符合要求,这个值可以有以下几种:v *,表示任意数量v ?,表示0或1个数量v +,表示至少一个数量v 数字,表示size要等于这个指定的数量
 
 
 
 
 


Java代码 
1.<count value="0" /> 
 
 这个属性虽然用的少,但是却不可少,以资源管理器为例,当一个工作区没有任何项目的时候,那么对应的size就为0,如果需要在这种情况出现一个菜单,那么就肯定需要这样一个表达式才能正确的处理。
 
 
 
 
 
with
 
通过variable属性取得选中对象的相应数据,比如通过选中对象的getAffectedProjects方法得到一个java.util.Collection对象,再通过iterate和test来进行表达式处理。
 
 
 


Java代码 
1.<with variable="affectedProjects"> 
2.     <iterate operator="or"> 
3.         <test property="org.demo.projectNature" value="org.eclipse.jdt.core.javanature"/> 
4.     </iterate> 
5.</with>   
 
 
 
 
 
resolve
 
它和with属性基本一致,但是它多了一个args属性,从而有更高的灵活性,其它方面与with并无区别。
 
 
 


Java代码 
1.<resolve variable="pluginDescriptor" args="org.eclipse.core.runtime"> 
2.     <test property="org.demo.isActive"/>  
3.</resolve> 
  
 
 
adapt
 
adapter是Eclipse架构的根本所在,它不仅仅解决了上下文环境的问题,对系统的扩展和灵活性都是一个非常好的解决方案,因此在表达式中也充分的利用这个特点。它可以将待处理的对象转换成指定的对象,这样也会有效的增加表达式的灵活性。
 
 
 


Java代码 
1.<adapt type="org.eclipse.core.resources.IResource"> 
2.    <test property="org.eclipse.core.resources.extension"         value="datasetx"/> 
3.</adapt> 
 
 
 
它表示会先将指定的对象通过adapter方式转成一个IResource的实例,如果转换成功,再判断其扩展名是否为datasetx,如果转换不成功,也会返回false。
 
 
 
 
 
test
以上提供了很多功能,但是可能对于开发人员,并不能完全满足他们相应的需求。所以Expression插件提供了test结点,这个结点允许用户通过一个扩展点来定义各种新的表达式处理功能,象org.eclipse.core.resources就提供了对扩展名等一系列的支持。在以后的文章将会详细的描述如何进行扩展。
 
 
 


Java代码 
1.<adapt type="org.eclipse.core.resources.IResource"> 
2.    <test property="org.eclipse.core.resources.extension"         value="datasetx"/> 
3.</adapt> 
 
 
 
这个例子会调用,org.eclipse.core.internal.propertytester.ResourcePropertyTester类来处理数据,从而获得更高的灵活性
 
 
 
注意:org.eclipse.core.resources.extension中的org.eclipse.core.resources是
 
org.eclipse.core.expressions.propertyTesters扩展中的命名空间,extension才是定义的属性。
 
 
 
 
 
最后关于test 的使用,涉及到另一个扩展点,org.eclipse.core.expressions.propertyTesters,自己定义的property
 
必须扩展一个PropertyTester来判断合法性。关于org.eclipse.core.expressions.propertyTesters扩展,
 
参考:http://salever.iteye.com/blog/944824

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值