GMF Tutorial: Mehrere Diagramme auf einer Editing Domain
Was ist hier die Idee? Eine Editing Domain enthält das Modell sowie den Command-Stack, der durch seine Kommandos auf dem Modell operiert. Nutzt man nun den GMF Generator, so erstellt dieser für jedes Diagramm-Plugin eine eigene EditingDomain. Was ist die Konsequenz davon? Nun, da nun jeder Editor seine eigene Domain hat, hat auch jeder seine eigene Kopie des Modells. Mehrere Views auf ein und dasselbe Modell sind damit unmöglich. Das betrifft sowohl mehrere Diagramme für eine Modellinstanz als auch mehrere Nicht-Diagramm-Views gemischt mit Diagrammen, die alle _synchrone_ Informationen zeigen. Beispiele in der PCMBench sind der Navigator View und die Diagramme, besonders das Repository- und das SEFF-Diagramm, da diese sogar direkt auf der selben Modellinstanz arbeiten können müssen. Was ist also zu tun, damit GMF mit einer einzigen EditingDomain auskommt?
Nun, zum Glück hat das wohl schon mal jemand gefragt und einen Artikel im GMF Wiki angelegt. Das ist sehr schön, jedoch auch dumm, weil die Anleitung nur mit GMF1.x funktioniert. Was nötig ist, damit es auch mit GMF2.0 (oder auch dem Nachbarn) klappt kommt hier:
- Zuerst: Die Anleitung aus dem GMF Wiki durchführen. Im Großen und Ganzen stimmt die noch.
- Dann in den generierten ??DiagramEditor Klassen noch die Methode
@Override protected String getEditingDomainID() { return "de.uka.ipd.sdq.PCMBench.editingDomain"; }
einfügen. Der zurückgegebene String muss die ID der gemeinsamen Editing Domain sein.
- In der generierten Datei ??DocumentProvider verbirgt sich der nächste Stolperstein. Dort wird (aus mir absolut unverständlichen Gründen, Buganfrage läuft) eine weitere EditingDomain erzeugt. Das ist natürlich in unserem Kontext Käse. Daher die ersten Zeilen der Methode ersetzen und @generated auf @generated NOT ändern
/** * @generated NOT */ private TransactionalEditingDomain createEditingDomain() { // TransactionalEditingDomain editingDomain = DiagramEditingDomainFactory // .getInstance().createEditingDomain(); // editingDomain.setID("de.uka.ipd.sdq.PCMBench.editingDomain"); //$NON-NLS-1$ TransactionalEditingDomain editingDomain = TransactionalEditingDomain.Registry.INSTANCE .getEditingDomain("de.uka.ipd.sdq.PCMBench.editingDomain"); [..]
- Und zum Schluss: Die Extension für die geteilte EditingDomain verlangt nach einer Factory-Klasse. Hierfür muss die GMF-Factory eingesetzt werden. Also
<extension point="org.eclipse.emf.transaction.editingDomains"> <editingDomain factory="org.eclipse.gmf.runtime.diagram.core.DiagramEditingDomainFactory" id="de.uka.ipd.sdq.PCMBench.editingDomain"/> </extension>
in der plugin.xml des Plugins, dass die Editing Domain bereitstellt.
Nun sollte es klappen...