RCP 自定义用于visible/enable when表达式的变量

来源:互联网 发布:淘宝手机连接转换 编辑:程序博客网 时间:2024/06/05 06:16

目的:定义类似于selection的RCP框架内部变量,用于visible when表达式的判定。


实现思路:使用source provider来实现。


具体步骤:

1、定义source provider:添加org.eclipse.ui.services扩展项sourceProvider,实现其provider属性类,此类为本文的重点所在,其功能为对外提供变量值,同时通过priorityLevel属性设置此变量的可视范围。

2、为此扩展项添加变量项,并将其name属性设置为变量名。


provider属性类实现实例:

package de.vogella.rcp.commands.sourceprovider;import java.util.HashMap;import java.util.Map;import org.eclipse.ui.AbstractSourceProvider;import org.eclipse.ui.ISources;public class CommandState extends AbstractSourceProvider {  public final static String MY_STATE = "de.vogella.rcp.commands.sourceprovider.active";  public final static String ENABLED = "ENABLED";  public final static String DISENABLED = "DISENABLED";  private boolean enabled = true;  @Override  public void dispose() {  }  // We could return several values but for this example one value is sufficient  @Override  public String[] getProvidedSourceNames() {    return new String[] { MY_STATE };  }    // You cannot return NULL  @SuppressWarnings("unchecked")  @Override  public Map getCurrentState() {    Map map = new HashMap(1);    String value = enabled ? ENABLED : DISENABLED;    map.put(MY_STATE, value);    return map;  }    // This method can be used from other commands to change the state  // Most likely you would use a setter to define directly the state and not use this toogle method  // But hey, this works well for my example  public void toogleEnabled() {    enabled = !enabled ;    String value = enabled ? ENABLED : DISENABLED;    fireSourceChanged(ISources.WORKBENCH, MY_STATE, value);  }} 


注意其中的getCurrentState方法,其即为对外提供变量值的接口。

至此,本文开头提出的目标达成。



到此出现一个衍生问题:如何在此变量值提供类外改变变量的值?


解决思路:通过RCP的框架API获取到此变量值提供类的实例,然后调用其内部函数改变变量值。


步骤:

1、获取source provider 服务实例。

    // Get the source provider service    ISourceProviderService sourceProviderService = (ISourceProviderService) HandlerUtil        .getActiveWorkbenchWindow(event).getService(ISourceProviderService.class);

或者为:

ISourceProviderService sourceProviderService = (ISourceProviderService) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getService(ISourceProviderService.class);




2、通过source provider 服务查找到对应变量名的source provider。

    // Now get my service    CommandState commandStateService = (CommandState) sourceProviderService        .getSourceProvider(CommandState.MY_STATE);    commandStateService.toogleEnabled();

注意其中的CommandState.MY_STATE即为变量名。

获取到source procider实例后即可调用其内部函数更改变量值。



参考资料:

1、Eclipse Commands Advanced - Tutorial





原创粉丝点击