EMF / GMF / Papyrus - 设置显式和ElementImpl - 属性不在代码中

时间:2013-10-08 10:02:44

标签: java css eclipse-emf eclipse-gmf papyrus

我有一个EMF模型和生成的编辑器。在模型/编辑器中,可以将元素“单元”(U)与“规范”(S)连接。现在,如果至少有一个U满足S,我希望有一个专门的CSS样式。但是(据我所知),在CSS-Stylesheet中没有办法实现这个(例如使用Selectors)纸莎草。

出于这个原因,我为S增加了一个名为“Mapped”的属性(当至少有一个U满足S时应该是真的,否则它是假的)。然后,我尝试在添加一个/多个连接时(在handleNotification - Method中)设置代码中的“Mapped”-Property:

notifier.setMapped(true);

带有感知:

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-File识别“Mapped”-Property的变化。

非常感谢:)

2 个答案:

答案 0 :(得分:3)

找到解决我问题的方法:

低音词似乎是异步的......

要按照以下方式成功更改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();
    }
}

答案 1 :(得分:-1)

您需要使用事务API在EMF中进行更改。所有 应使用命令对模型进行更改。

Have a look at the API