Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Eclipse Scout在离开页面时检查_Eclipse_Treenode_Savechanges_Eclipse Scout - Fatal编程技术网

Eclipse Scout在离开页面时检查

Eclipse Scout在离开页面时检查,eclipse,treenode,savechanges,eclipse-scout,Eclipse,Treenode,Savechanges,Eclipse Scout,我正在写一份童子军申请书,我偶然发现了一些问题。 在我的标准大纲中,我有不止一页。在A页,我有一些带有保存按钮的可编辑表格。B页中的内容对于本次讨论并不重要 Outline page A page B 如果选择了A页,并且我编辑了一些数据,我希望在单击B页时收到一些数据未保存的通知 所以在大纲在A页和B页之间切换之前,我想控制不切换到B页,因为A页中的相同数据没有保存 实际上,我已经通过扩展页面解决了这个问题,但我想知道是否有一些标准的预定义方法可以解决这个问题 不幸的是,没有办法

我正在写一份童子军申请书,我偶然发现了一些问题。 在我的标准大纲中,我有不止一页。在A页,我有一些带有保存按钮的可编辑表格。B页中的内容对于本次讨论并不重要

Outline
   page A
   page B
如果选择了A页,并且我编辑了一些数据,我希望在单击B页时收到一些数据未保存的通知

所以在大纲在A页和B页之间切换之前,我想控制不切换到B页,因为A页中的相同数据没有保存


实际上,我已经通过扩展页面解决了这个问题,但我想知道是否有一些标准的预定义方法可以解决这个问题

不幸的是,没有办法阻止节点选择的真正发生。如前所述,您可以通过分别覆盖方法
execPageActivated
execPageDeactivated
,来侦听页面中的激活和停用事件。但通过使用这种方法,您无法控制节点切换

通过在大纲类中提供自己的
createPageChangeStrategy
实现,通过注入自定义
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);
        }
      }
    };
  }

我能想到的唯一方法就是在你的
AbstractOutline
上使用
setPageChangeStrategy
。在这里,您可以防止页面被实际更改,但我不知道如何防止在树中选择节点。理想情况下,您希望在用户选择新页面之前拦截事件。