2013-10-08 5 views
4

У меня есть EMF-модель и сгенерированный редактор. В модели/редакторе можно подключить элемент «Единица» (U) с «Спецификацией» (S). Теперь я хочу иметь специальный CSS-стиль для S, если хотя бы один U удовлетворяет S. Но (насколько мне известно) нет способа выполнить это (например, с селекторами) в CSS-стиле для Папирус.EMF/GMF/Papyrus - Set excplicit ElementImpl - Свойство вне кода

По этой причине я добавил дополнительное свойство для S, называемое «Mapped» (должно быть истинным, когда хотя бы одно U удовлетворяет S, иначе оно ложно). Затем я попытался установить "сопоставленные" -property из кода, когда были добавлены один/более соединения (в handleNotification - метод):

notifier.setMapped(true); 

с excception:

IllegalstateException: Cannot modify resource set without a write transaction 

г. Вторым решение привело к еще одно исключение, но с тем же результатом семантического:

ed.getCommandStack().execute(SetCommand.create(ed, notifier, 
    xyzPackage.Literals.SPECIFICATION__MAPPED, true)); 

за исключением:

java.lang.IllegalStateException: Cannot activate read/write 
    transaction in read-only transaction context 

Кто-нибудь знает, как справиться с этими Исключениями или иметь хорошее обходное решение? Основная цель состоит в том, что CSS-файл распознает изменение «Mapped» -Property.

спасибо :)

+0

«Тогда я попытался установить„Mapped“-свойство из кода». Где находится код? Как вы получаете/создаете транзакционный домен редактирования? – ASBH

+0

В спецификации SpecificationEditPart.handleNotification (событие уведомления) я добавил код, указанный в моем сообщении ... TransactionalEditingDomain ed = (TransactionalEditingDomain) this.getEditingDomain; (где этот экземпляр SpecificationEditPart) – Shounbourgh

ответ

3

найдено решение для моей проблемы:

bassword, кажется, асинхронный ...

Чтобы успешно изменить свойства EObjects следующие я должен был сделать:

public void SpecificationEditPart.handleNotification(Notification event) 
{ 

    EObject eObject = (EObject)event.getNotifier(); 

    SpecificationImpl notifier = (SpecificationImpl)eObject; 

    EList<Satisfy> satisfyRelationList = notifier.getIncoming(); 

    int satisfyRelationListSize = satisfyRelationList.size(); 

    TransactionalEditingDomain ted = (TransactionalEditingDomain)AdapterFactoryEditingDomain.getEditingDomainFor(eObject); 

    try 
    { 
     ted.runExclusive(new Runnable() 
     { 
      public void run() 
      { 
       Display display = PlatformUI.getWorkbench().getDisplay(); 
       display.asyncExec(new Runnable() 
       { 
        public void run() 
        { 
         ted.getCommandStack().execute(new SetCommand(this.ted, notifier, xxxPackage.Literals.SPECIFICATION__MAPPED, true)); 
        } 
       }); 
      } 
     }); 
    } 
    catch (InterruptedException e) 
    { 
     e.printStackTrace(); 
    } 
} 
+0

Кажется, что вы также можете выполнить org.eclipse.gef.commands.Command в методе запуска без каких-либо проблем. – nmargaritis

-1

Вам необходимо использовать API транзакций для внесения изменений в EMF. Все изменения, внесенные в модель, должны выполняться с помощью команд.

Have a look at the API

+0

Это очевидно, и @Shounbourgh упомянул, что сам в вопросе! –

 Смежные вопросы

  • Нет связанных вопросов^_^