我正在写一个侦察应用程序,我偶然发现了一些问题。 在我的标准大纲中,我有多个页面。在页面A中,我有一些带保存按钮的可编辑表格。第B页中的内容对于此讨论并不重要。
Outline
page A
page B
如果选择了页面A并且我编辑了一些数据,我希望在点击第B页时通知我某些数据未保存。
所以在Outline A和B之间切换之前我想控制不切换到B页,因为A中的相同数据没有被保存。
我实际上已经通过扩展页面解决了这个问题,但我看看是否有一些标准的预定义方式。
答案 0 :(得分:3)
不幸的是,没有办法阻止节点选择真正发生。如您所述,您可以通过分别覆盖方法execPageActivated
和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);
}
}
};
}