不幸的是,没有办法阻止节点选择真正发生。正如您所提到的,您可以通过分别覆盖方法execPageActivated
和来侦听 Page 中的激活和停用事件execPageDeactivated
。但是通过使用这种方法,您无法控制节点切换。
通过createPageChangeStrategy
在 Outline 类中注入自定义的DefaultPageChangeStrategy
. 因此,每次节点更改发生在相应的 pageChange 事件中时,您都会收到通知。只要您的页面无效,您就可以防止页面切换发生并恢复源树选择。
请看以下示例:
@Override
IPageChangeStrategy createPageChangeStrategy() {
return new DefaultPageChangeStrategy() {
@Override
public void pageChanged(IOutline outline, IPage deselectedPage, IPage selectedPage) {
if (deselectedPage instanceof APage && !((APage) deselectedPage).isValid()) { // #isValid is your check method for validity.
// Do not propagate the PageChangeEvent and restore the selection of the invalid page.
// Uninstall the PageChangeStrategy to ignore the event of restoring the selection.
final IPageChangeStrategy pageChangeStrategy = this;
setPageChangeStrategy(null);
// Restore the selection and install the PageChangeStrategy anew.
new ClientSyncJob("Restore node selection", ClientSession.get()) {
@Override
protected void runVoid(IProgressMonitor monitor) throws Throwable {
YourOutline.this.selectNode(deselectedPage);
setPageChangeStrategy(pageChangeStrategy);
}
}.schedule();
}
else {
super.pageChanged(outline, deselectedPage, selectedPage);
}
}
};
}