2012-02-10 24 views
0

私は今、EMFにダイビングだし、次のような問題が発生している:私は次のコードでフィールドセットからフィールドを削除しようとしているEMF編集ドメインコマンドの作成

を:

FieldElem ff = ds.getContent().getNestedFieldset().get(0).getField().get(0); 

      Command remove = new RemoveCommand(editingDomain, nf, 
          DescPackage.eINSTANCE.getNestedFieldsetElem_Field(), ff); 
      editingDomain.getCommandStack().execute(remove); 

      ff = ds.getContent().getNestedFieldset().get(0).getField().get(0); 

      Command remove2 = RemoveCommand.create(editingDomain, nf, 
        DescPackage.eINSTANCE.getNestedFieldsetElem_Field(), ff); 
      editingDomain.getCommandStack().execute(remove2); 

      ff = ds.getContent().getNestedFieldset().get(0).getField().get(0); 

      Command remove3 = RemoveCommand.create(editingDomain, ff); 
      editingDomain.getCommandStack().execute(remove3); 

最初の2コマンドは正常に動作しますが、3番目のコマンドはうまく動作しません。私はコマンドスタックに追加するつもりはなく、何も削除していません。何が間違っているのですか?

UPDATE:デバッガで見たように、executeメソッドはUNEXECUTABLE_COMMANDを返します。

答えて

1

RemoveCommand.create(editingDomain, ff)の指示は、ffをコンテナ(すなわちff.eContainer != null)にした場合にのみ使用できます。 eContainerは、包含関係を持つリレーションにオブジェクトを追加すると、EMFによって自動的に設定されます。

getField()の関係は包含関係ではないため、remove3コマンドは確実に機能しません。

+0

ありがとうございました! eContainer == null、あなたが予測した通りです。どのようにそれを修正する必要がありますか?それはモデルの設定に関連していますか?私はXSDスキーマからモデルを生成しましたが、max/min要素を除いて、それをあまり変更しませんでした。 – execc

+1

@execc:XSDからどのように作品が生成されるのか分かりません。 .ecoreファイルがある場合、関係が選択されると、包含関係はプロパティビューで設定できます。オブジェクトにはコンテナが1つしかないため、EMFの動作は変更されます。したがって、オブジェクトをコンテナメントリストに追加し、このオブジェクトがすでに包含リストにある場合、EMFはオブジェクトをサイレントに削除しますこれまでのリストから。デバッグが難しい場合があります。 – Baldrick

+0

はここに私のモデルのための私のセットアップです:https://lh4.googleusercontent.com/-1aIvcp-aJHs/TzT22CtrhDI/AAAAAAAAAAc/6GZhtwlSfBk/s963/containment.JPGとフィールドは、フィールドセットとの包含関係を持っているように見えます。どうしましたか? – execc

0

最終的に私は答えに設立しました:私はソースとして使用され、XSDてきたように

を、モデルがこのフラグメントから生成されました:

<xsd:sequence> 
     <xsd:choice minOccurs="0" maxOccurs="unbounded"> 
      <xsd:element name="field" type="fieldElem" /> 
      <xsd:element name="autofill-field" type="fieldElem" minOccurs="0" maxOccurs="unbounded"/> 
      <xsd:element name="fieldset" type="fieldsetElem" /> 
      <xsd:element name="join-field" type="joinFieldElem"/> 
     </xsd:choice> 
    </xsd:sequence> 

のでFieldsetElemは、含まれていませんFieldElemは、代わりに適切なFutureMapエントリから導出されます。正しいコードは

Command remove = RemoveCommand.create(ed, ed.getWrapper(fe)); 
関連する問題