Eclipse插件开发根据需要显示按钮或菜单

  • 介绍
有时候我们需要根据特定的情况来决定是否要实现菜单或者按钮,换句话说只有满足特定要求的情况下再显示或者变成可用的。这时候,可以借助Eclipse的表达式框架。 表达式框架是在插件org.eclipse.core.expressions中实现的。 另外,Eclipse的表达式框架还支持表达式的重用。如果某个表达会再多处使用,就不再需要重复定义了。
  • visibleWhen
这个可以用在command、menu子节点下,例如: [codesyntax lang="xml"]
<visibleWhen
      checkEnabled="false">
   <with
         variable="selection">
      <iterate
            ifEmpty="false"
            operator="or">
         <adapt
               type="org.eclipse.core.resources.IResource">
            <or>
               <test property="org.eclipse.core.resources.extension"
                     value="xml"/>
               <test property="org.eclipse.core.resources.projectNature"
                       	value="org.eclipse.m2e.core.maven2Nature" />
            </or>
         </adapt>
      </iterate>
   </with>
</visibleWhen>
[/codesyntax]
  • activeWhen
[codesyntax lang="xml"]
<activeWhen>
   <with
         variable="activePart">
      <instanceof value="org.eclipse.ui.internal.views.markers.ExtendedMarkersView"/>
      <test
            args="any"
            property="org.eclipse.ui.ide.contentGenerator">
      </test>
   </with>
</activeWhen>
[/codesyntax]
  • visibility
可以作用在objectContribution等子节点中,例如: [codesyntax lang="xml"]
<visibility>
  <and>
    <objectState name="open" value="true"/>
    <objectState name="nature" value="org.eclipse.m2e.core.maven2Nature"/>
  </and>
</visibility>
[/codesyntax] [codesyntax lang="xml"]
<visibility>
   <objectState name="name" value="pom.xml"/>
</visibility>
[/codesyntax]
  • selection
可以用在action标签下,例如: [codesyntax lang="xml"]
<selection class="org.eclipse.wst.server.ui.IServerModule" />
<selection class="org.eclipse.wst.server.core.IServer" />
[/codesyntax]
  • enablement
  • 表达式重用(Re-Usable expressions)
要使用表达式需要添加扩展点org.eclipse.core.expressions.definitions,重用的时候使用<reference>标签。例如: [codesyntax lang="xml"]
<extension point="org.eclipse.core.expressions.definitions">
	<definition id="org.acme.navigator.enablement">
		<or>
			<instanceof value="com.acme.navigator.ContainerObject">
			</instanceof>
			<instanceof value="com.acme.navigator.RootObject">
			</instanceof>
			<adapt type="org.eclipse.core.resources.IResource">
				<test property="org.eclipse.core.resources.projectNature"
					value="com.acme.navigator.nature">
				</test>
			</adapt>
		</or>
	</definition>
</extension>
<enablement>
	<reference definitionId="org.acme.navigator.enablement">
	</reference>
</enablement>
[/codesyntax] 可以在任何插件中申明definition,然后就可以在其他任何插件中使用,甚至不需要有依赖关系。
  • 表达式中的操作符
目前,表达式框架支持13中操作。有些是可以包含其他操作符的,例如:adapt。
  1. adapt,检查是否是某个类的子类
  2. and/or/not,将会返回布尔值
  3. count,用于判断集合的数量,不能包含其他操作,可以喝<iterate>联合使用。可以用的包含:*(匹配任何数字,包括0)、?(一个或者没有)、!(没有)、+(一个或者多个)、-NN)(小于个整数)、(NN-(大于一个整数)、NN(等于一个整数)。
  4. equals,检查是否相同
  5. instanceof,是否为某个类的子类
  6. iterate,有两个参数:operator和ifEmpty
  7. reference
  8. resolve
  9. systemTest,使用系统属性做测试结果,java.lang.System.getProperties()
  10. test
  11. with
  • 扩展点 org.eclipse.core.expressions.propertyTesters
[codesyntax lang="xml"]
<extension point="org.eclipse.core.expressions.propertyTesters">
	<propertyTester class="org.acme.PatternPropertyTester"
		id="org.acme.patternPropertyTester" namespace="org.acme"
		properties="matchesPattern, equalsPattern" type="org.eclipse.core.resources.IResource">
	</propertyTester>
</extension>
[/codesyntax]
  • 参考
https://wiki.eclipse.org/Platform_Expression_Framework http://help.eclipse.org/juno/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/workbench_cmd_expressions.htm

你可能感兴趣的:(表达式)