# EMF Automatisches hinzufügen von Kindelementen?



## greeni (21. Sep 2010)

Hallo Zusammen,

ich benutze den von EMF generierten Editor. 
Wenn ich in dem Editor, über das Kontextmenu ein neues Element hinzufüge (Nennen Wir es mal *Element 3*), so möchte ich das alle Kindelemente von *Element 3* auch automatisch hinzugefügt werden. Also Element 3.1, Element 3.2, Element 3.3, usw...

Verstehe ich das richtig, das ich hierzu die CreateCommand Methode von Element 3 überschreiben muss?
Wenn ich mir diese Metohode anschaue ist dies ziemlich verwirrend... da sie sehr komplex ist. Was müsste ich da denn genau ändern? Bzw. ist das mit dem Überschreiben dieser Methode überhaubt der richtige Ansatz?


----------



## Wildcard (21. Sep 2010)

Verstehe ich es richtig das Element 3 bereits irgendwo existiert, 3 Kinder hat und du es irgendwo referenzieren willst? Falls nein, wo kommen die 3 Kinder 3.1, 3.2 und 3.3 überhaupt her?
Falls ja: du kannst im genmodel einstellen welche Referenzen als Kinder im Baum dargestellt werden, dazu brauchst du keinen Code zu schreiben


----------



## greeni (23. Sep 2010)

Nein, so ist es nicht...

Also der *Ist-Stand* ist folgender:
Ich wähle in dem Editor das Wurzelelement aus und bekomme jetzt über das Kontextmenü alle Elemente dargestellt, welche ich dem Wurzelelement hinzufügen kann. 
Hier steht auch mein *Element 3*. Wenn ich dieses auswähle sieht mein Baum volgender Maßen aus:
*<Wurzelelement>*
---*<Element 3>*

Wähle ich jetzt das Element 3 aus, so bekomme ich im Kontextmenu die Elemente 3.1, 3.2 und 3.3 dargestellt. Diese muss ich jetzt von Hand wiederum alle auswählen wenn ich sie dem Element 3 hinzufügen möchte.


Der *Soll-Stand* soll aber folgender sein:
Ich wähle über das Kontextmenü dss Element 3 aus und sofort wird auch Elemente 3.1, 3.2 und 3.3 erstellt und Element 3 zugewiesen und der Baum sieht folgender maßen aus.

*<Wurzelelement>*
---*<Element 3>*
-------*<Element 3.1>*
-------*<Element 3.2>*
-------*<Element 3.3>*


----------



## Wildcard (23. Sep 2010)

Ach so, du möchtest direkt einige Children erzeugen?
Hmm, ok, ich habe selten mit dem generierten Editor zu tun, daher ist das vielleicht nicht der eleganteste Weg (das EMF Buch zeigt sicher wie es richtig geht), aber es funktioniert:
Ich habe ein Modell gebaut mit einer EClass Root die ein Kind Element3 aufnehmen kann. Element3 hat 3 mögliche Kinder, Element3_1, Element3_2 und Element3_3. Das entspricht in etwa deinem Setting?

Geh in den RootItemProvider (oder wie immer der Parent von Element3 bei dir heißt).
Dort überschreibst du folgende Methode:


```
@Override
	protected Command createCreateChildCommand(EditingDomain domain,
			EObject owner, EStructuralFeature feature, Object value, int index,
			Collection<?> collection) {
		if(feature==MymodelPackage.Literals.ROOT__ELEMENT3 && value instanceof Element3)
		{
			Element3 element3 =(Element3)value;
			element3.setElement1(MymodelFactory.eINSTANCE.createElement3_1());
			element3.setElement2(MymodelFactory.eINSTANCE.createElement3_2());
			element3.setElement3(MymodelFactory.eINSTANCE.createElement3_3());
		}
		return super.createCreateChildCommand(domain, owner, feature, value, index,
				collection);
	}
```


----------



## greeni (24. Sep 2010)

Wieso so soll das den nicht elegant sein? 
Es funktioniert! Dankeschön!


----------

