您的位置:首页 > 其它

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

2013-09-13 15:23 344 查看
目的:定义类似于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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐