Как получать уведомления, когда модель EMF xtext изменяется с правильными значениями

У нас есть FormEditor, содержащий четыре страницы: три FormPages и четвертая страница XTextEditor в качестве исходной страницы.

Всякий раз, когда пользователь вносит какие-либо изменения (например, изменяет значение в текстовом поле) на FormPages, мы изменяем содержимое модели EMF внутри метода XTextDocument.modify(), как показано ниже:

    xtextEditor.getDocument().modify(new IUnitOfWork.Void<XtextResource>() {

        @Override
        public void process(XtextResource state) throws Exception {
            IParseResult parseResult = state.getParseResult();
            Assert.isNotNull(parseResult);
            EObject rootASTElement = parseResult.getRootASTElement();

            if (rootASTElement instanceof MyModel) {
               XyzType t = ((MyModel) rootASTElement).getXyzType();
                t.setName(name);   <- ‘name’ is the new value entered on FormPage text box
            }
        }
    });

Теперь мы хотим получать уведомления в FormPages всякий раз, когда модель EMF изменяется, когда пользователь вносит некоторые изменения на исходной странице, например XTextEditor.

Мы попытались добавить IXtextModelListener и IXtextDocumentContentObserver в IXtextDocument; но они вызываются для каждого символа, введенного в XTextEditor.

Наше требование — получать уведомления только при изменении значений в модели EMF (а не для форматирования текста, например, при вставке/удалении пробелов).

Может кто-нибудь, пожалуйста, дать несколько указателей?

С уважением, Ахил.


person User_86    schedule 07.02.2014    source источник
comment
вы также пытались опираться на org.eclipse.emf.common.notify.Notifier?   -  person SpaceTrucker    schedule 10.02.2014
comment
@SpaceTrucker: Спасибо за быстрый ответ!! Я не использовал этот подход. Не могли бы вы рассказать мне об этом подробно?   -  person User_86    schedule 11.02.2014
comment
Я сам не использовал этот API, но поскольку его реализует каждый EObject, я подумал, что предложить его было бы хорошей идеей. Вам нужно будет зарегистрировать один и тот же org.eclipse.emf.common.notify.Adapter для каждого объекта в вашей модели. Этот адаптер будет получать уведомления при изменении вашей модели. Но для того, чтобы это работало, редактор xtext не должен каждый раз создавать новую модель, а должен модифицировать существующую.   -  person SpaceTrucker    schedule 11.02.2014
comment
Вы нашли решение своего вопроса?   -  person aphex    schedule 15.12.2014
comment
поскольку xtext все время воссоздает модель ЭДС, слушатели не помогут. вам пришлось бы все время хранить копии модели и все время сравнивать копию с текущим состоянием модели, чтобы узнать, изменилось ли что-то на самом деле   -  person Christian Dietrich    schedule 11.06.2015


Ответы (1)


Вы можете использовать клиентскую платформу EMF (ECP), которая добавляет реализацию Шина наблюдателя к модели EMF.

Они реализуют собственную службу проверки, которая делает то, что вы описали:

ecp.view.validation Это служба проверки, которая отслеживает модель домена и вычисляет проверку. ошибки.

Служба проверки уже использует шину наблюдателя ECP для регистрации событий изменения EMF. Сама Observer Bus реализована как EContentAdapter, прослушивающий каждое изменение модели. Он уже фильтрует события изменений и передает их в соответствии с шаблоном Observer Bus на шину событий, которую вы можете зарегистрировать. Там вы получаете только те события, на которые вы зарегистрировались, а не все события, как для EContentAdapter, которые вы должны отфильтровать для себя.

Я думаю, что они в основном используют его для проверки моделей, чтобы показать результаты в своем графическом интерфейсе EMF Forms. Однако вы можете пользоваться услугами и по отдельности.

person Hauke    schedule 11.06.2015