参数化命令只接受字符串。
以下是较小对象的示例:
免责声明:这是针对 Eclipse 3.x 的。我没有经常使用 Eclipse 4.x,所以你可能需要适应那里以备不时之需。
创建一个带有视图 (com.voo.example.commandparameter.advanced.view) 的插件项目 (com.voo.example.commandparameter.advanced) 和一个命令 (com.voo.example.commandparameter.advanced.sysoCommand)菜单项和Handler(com.voo.example.commandparameter.advanced.sysoCommand),以及一个通用对象(MyTestObject)。
Command 需要 plugin.xml 中的 Parameter 和 Parametertype 传递给它:
<extension
point="org.eclipse.ui.commands">
<command
id="com.voo.example.commandparameter.advanced.sysoCommand"
name="SysoCommand">
<commandParameter
id="myObject"
name="object"
optional="true"
typeId="com.voo.example.commandparameter.advanced.testType">
</commandParameter>
</command>
<commandParameterType
id="com.voo.example.commandparameter.advanced.testType"
type="com.voo.example.commandparameter.advanced.MyTestObject">
</commandParameterType>
在 Object 中,您可以设置 name 和 street 等属性,并像这样定义一个 convertToString 方法:
public String convertToString() {
return getName() +",,,"+ getStreet();
}
(你也可以重写 toString 方法。我只是使用该方法将奇怪的分隔符设置为返回的字符串)
在 MyParamterConverter 类中,您可以将其传回:
public class MyParameterConverter extends AbstractParameterValueConverter {
public MyParameterConverter() {
}
@Override
public String convertToString(Object parameterValue)
throws ParameterValueConversionException {
return parameterValue.toString();
}
/**
* This will always create a new object. Just keep that in mind
* if you're trying to work with the objects.
*/
@Override
public Object convertToObject(String parameterValue)
throws ParameterValueConversionException {
//Split the String to get the attributes back
String delimiter =",,,";
String[] split = parameterValue.split(delimiter);
String name = split[0];
String street = split [1];
return new MyTestObject(name, street);
}
}
现在您可以在视图中通过单击按钮来调用命令,例如:
btnGo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
MyTestObject testObject = new MyTestObject(textName.getText(),textStreet.getText());
ICommandService cS = (ICommandService)getSite().getService(ICommandService.class);
IHandlerService hS = (IHandlerService)getSite().getService(IHandlerService.class);
Command sysoComm = cS.getCommand("com.voo.example.commandparameter.advanced.sysoCommand");
HashMap<String, String> params = new HashMap<String, String>();
params.put("myObject", testObject.convertToString());
ParameterizedCommand pC = ParameterizedCommand.generateCommand(sysoComm, params);
try {
hS.executeCommand(pC, null);
} catch (Exception e) {
e.printStackTrace();
}
}
});
并且Handler可以将传入的参数转换回来:
public class MyObjectHandler extends AbstractHandler {
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
String param1 = event.getParameter("myObject");
MyParameterConverter converter = new MyParameterConverter();
Object convertToObject = null;
try {
convertToObject = converter.convertToObject(param1);
} catch (ParameterValueConversionException e) {
e.printStackTrace();
}
if (convertToObject instanceof MyTestObject) {
MyTestObject to = (MyTestObject) convertToObject;
System.out.println(to.toString());
}
return null;
}
}
这应该适用于大多数在您传递时不会改变的较小尺寸的对象。如果您需要传递更大的对象,您将有两种选择:A)使用“执行事件”的选定对象(检查一下,它包含很多信息)。 B) 您可以使用 AbstractSourceProvider,因此您可以将您的对象传递给应用程序上下文。