Проверка Eclipse Scout при выходе со страницы

Пишу скаутское приложение, и наткнулся на какую-то проблему. В моем стандартном Outline больше одной страницы. На странице A у меня есть редактируемая таблица с кнопкой сохранения. То, что находится на странице B, не важно для этого обсуждения.

Outline
   page A
   page B

Если выбрана страница A и я редактирую некоторые данные, я хотел бы получать уведомления, если я нажму на страницу B, что некоторые данные не сохранены.

Поэтому перед переключением Outline между страницами A и B я хотел бы иметь контроль, чтобы не переключаться на страницу B, потому что те же данные в A не сохраняются.

На самом деле я решил эту проблему с расширением страниц, но я ищу, есть ли для этого какой-то стандартный предопределенный способ.


person Marko Zadravec    schedule 06.08.2014    source источник
comment
Единственный способ, который я могу придумать, это setPageChangeStrategy на вашем AbstractOutline. Там вы можете предотвратить фактическое изменение страницы, но я не знаю, как предотвратить выбор узла в дереве. В идеале вы хотели бы перехватить событие до того, как пользователь выберет новую страницу.   -  person jmiserez    schedule 06.08.2014


Ответы (1)


К сожалению, нет способа предотвратить выбор узла в действительности. Как вы упомянули, вы можете прослушивать события активации и деактивации на своей странице, переопределяя методы 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);
        }
      }
    };
  }
person Daniel Wiehl    schedule 12.08.2014