我有一个贡献命令和一个处理程序。处理程序的execute事件必须获取属性视图中实际选择的属性的值并对其进行操作,或者在未选择任何属性时禁用。
我试过了:
1)将选择提供程序设置为可从属性视图中提供选择的内容。在这种情况下,我的PropertySheetPage只是PropertySheetViewer,但是我不能将它设置为选择提供者,因为PropertySheetPage的查看器是私有的,没有getter。
2)重写PropertySheetPage的createControl方法:此方法为PropertySheetViewer创建Tree控件。可以为该树控件安装选择侦听器,所以也许我可以使我的命令处理程序实现SelectionListener ...解决方案可能会像:
在我的编辑中:
public Object getAdapter(@SuppressWarnings("rawtypes") Class type) {
if (type == IPropertySheetPage.class) {
PropertySheetPage page = new PropertySheetPage() {
@Override
public void createControl(Composite parent) {
super.createControl(parent);
IHandler handler = someWayToGetMyCmdHandler();
((org.eclipse.swt.widgets.Tree) getControl())
.addSelectionListener(handler);
}
};
IPropertySheetEntry entry = new UndoablePropertySheetEntry(
getCommandStack());
page.setRootEntry(entry);
return page;
}
return super.getAdapter(type);
}
我的命令处理程序正在实现SelectionListener,因为我说...这种方法的问题是我找不到一种方法来获取对我的贡献命令处理程序的引用(上面的someWayToGetMyCmdHandler())。
有没有人对此问题或任何其他可能解决问题的方法有任何线索?
答案 0 :(得分:1)
PropertySheetPage
中的handleEntrySelection(ISelection selection)
方法可以覆盖以通知查看器中的选择更改(尽管PropertySheetPage
为@noextend
)。
第二部分(更新处理程序)比通常情况下要复杂一些。当工作台选择发生变化时,命令/处理程序会自动更新(您只需要实现setEnabled(Object evaluationContext)
AbstractHandler
)。但由于PropertySheetPage
旨在改变其对全局选择更改的输入,因此您必须找到一些自定义方式来通知/更新您的处理程序。
据我了解,目前无法使用自定义变量扩展platform命令事件处理机制,因此您只需使用工作台的IHandlerService
直接查找处理程序。