# EMF Databinding und Undo/Redo



## Gelöschtes Mitglied 52732 (14. Feb 2016)

Hallo Forum,

ich habe ein EMF-Modell (Eclipse Mars .1) erstellt und möchte nun Dialoge programmieren, um mit diesen Dialogen das Modell zu manipulieren.
Der Ablauf soll zunächst so aussehen:
Ein Dialog besteht meist aus einem TableViewer, aus dem wählt der Nutzer das zu manipulierende Modell-Element. Nach Wahl des Elements sollen z. B. diverse Text-Widgets mit den Properties des Modell-Elements gefüllt werden. Die Änderungen innerhalb des Dialoges sollen aber erst ins Modell gehen wenn der Nutzer "OK" klickt oder alternativ alle "undo"t werden, wenn der Nutzer auf "Abbruch" klickt.

Ich habe schon viel dazu gelesen und es scheint etliche Möglichkeiten zu geben, so etwas zu realisieren, frage mich aber: was ist der _richtige_ Weg, das zu tun?
Ich arbeite mit dem WindowBuilder, habe aber den Eindruck dass er es nicht unterstützt, ein entsprechendes Binding anzulegen.


----------



## Joose (15. Feb 2016)

Der WindowBuilder hilft dir dabei SWT bzw. Swing Anwendungen zu gestalten. Soweit ich weiß gibt es dort keine "Binding" Varianten bzw. keine fertigen. Man könnte natürlich ein fertige Library nehmen welche sowas implementiert oder es eben selbst implementieren.

Gerade deine Beschreibung wie es ablaufen soll spricht doch etwas gegen Databinding. Du willst er bei Klick auf einen "OK" Button die Daten von der UI ins Model übernehmen, bei Databinding würde dies automatisch passieren (soweit meine bisherigen Erfahrungen damit)


----------



## Gelöschtes Mitglied 52732 (15. Feb 2016)

Joose hat gesagt.:


> Der WindowBuilder hilft dir dabei SWT bzw. Swing Anwendungen zu gestalten. Soweit ich weiß gibt es dort keine "Binding" Varianten bzw. keine fertigen.


Doch, das kann er, und zwar sowohl Pojo-Bindings wie auch EMF-Bindings, siehe z. B. hier.
Allerdings scheint es so zu sein, dass der WindowBuilder keine EMF.Edit-Observables erstellen kann, siehe hier.


Joose hat gesagt.:


> Gerade deine Beschreibung wie es ablaufen soll spricht doch etwas gegen Databinding. Du willst er bei Klick auf einen "OK" Button die Daten von der UI ins Model übernehmen, bei Databinding würde dies automatisch passieren (soweit meine bisherigen Erfahrungen damit)


Jein 
Databinding brauche ich ja allein, um z. B. TableViewer initial mit dem Modell zu befüllen und weil die Änderungen die der Nutzer in den Text-Widgets macht auch direkt in den TableViewern reflektiert werden sollen.
Hier im Forum gibts ja auch ein paar Threads die sich mit EMF-Databinding beschäftigen, da gibt es die Idee, im Dialog einfach nur mit einer Kopie des Modells zu arbeiten, das dann bei Klick auf "OK" das Modell überschrieben wird. Das kann ja nun nicht das Gelbe vom Ei sein, ein Modell mit - ich sag mal - paar tausend Elementen zu kopieren, wenn ich dann einen String ändere.


Joose hat gesagt.:


> Man könnte natürlich ein fertige Library nehmen welche sowas implementiert


Genau das ist ja auch mein Ziel, und (zum Beispiel) mit EMF.Edit gibt es ja die Möglichkeit, die Operationen auf einer EditingDomain auszuführen, wo man dann wohl die Kommandos vom CommandStack "undo"en kann. Da die Seiten die ich dazu so finden konnte jeweils mehrere Jahre alt sind, halt zusätzlich die Frage ob das alles noch so aktuell ist.


----------



## lam_tr (15. Feb 2016)

Hallo zusammen,



> Der WindowBuilder hilft dir dabei SWT bzw. Swing Anwendungen zu gestalten. Soweit ich weiß gibt es dort keine "Binding" Varianten bzw. keine fertigen.


Das stimmt, soweit nicht ganz. Mit dem WindowsBuilder kannst du das Binding für Emf Modell binden. Geht soweit ganz gut, du muss lediglich Emf Databinding libs in dein Plugin als Dependency  hinzufügen. Habe ich schon mal hinbekommen. Am besten gehst du unter Dependency und guckst unter add was alles and EMF Databinding Bundles gibt.



> Jein
> Databinding brauche ich ja allein, um z. B. TableViewer initial mit dem Modell zu befüllen und weil die Änderungen die der Nutzer in den Text-Widgets macht auch direkt in den TableViewern reflektiert werden sollen.
> Hier im Forum gibts ja auch ein paar Threads die sich mit EMF-Databinding beschäftigen, da gibt es die Idee, im Dialog einfach nur mit einer Kopie des Modells zu arbeiten, das dann bei Klick auf "OK" das Modell überschrieben wird. Das kann ja nun nicht das Gelbe vom Ei sein, ein Modell mit - ich sag mal - paar tausend Elementen zu kopieren, wenn ich dann einen String ändere.


Ich würd an deiner Stelle eine neue Instanz deiner Datenstruktur in das Dialog packen und bindet alle Werte vom Dialog, sobald du auf ok geklickt hast, wird es an dein "benutzte" Instanz übertragen. Bei Cancel einfach die Instanz verwerfen.

Und als kleiner Tipp du kannst die TableViewer Konfiguration vom generierten Code übernehmen mit AdapterFactory, das heißt viel Implementierung für die Tabelle ist nicht mehr notwendig.

Viele Grüße
lam


----------



## Gelöschtes Mitglied 52732 (22. Feb 2016)

lam_tr hat gesagt.:


> Ich würd an deiner Stelle eine neue Instanz deiner Datenstruktur in das Dialog packen und bindet alle Werte vom Dialog, sobald du auf ok geklickt hast, wird es an dein "benutzte" Instanz übertragen. Bei Cancel einfach die Instanz verwerfen.


Wie ich weiter oben schon schrieb: das kann ja nicht ganz das Wahre sein. Das Modell kann im Produktiveinsatz Elemente im 4- oder 5-stelligen Bereich enthalten und jeder Dialog im Programm editiert Daten auf dem Modell. Und den ganzen Aufwand dafür zu treiben, dass von sagen wir mal 8000 Modell-Elementen 2 Assoziationen und eine Property geändert wird ist schon irgendwie Quatsch.

Ich habe jetzt nochmal viel Zeit in Suchen investiert und folgendes herausgefunden:
Der Stand ist von 2009 bzw. 2011, neuere Informationen konnte ich nicht finden.

WindowBuilder hat grundsätzlich Support für EMF Databinding, aber *nur* für reines EMF-Databinding mit EMFObservables, keinen Support für EMF.Edit (was EditingDomain und CommandStack mitbringt und somit Undo/Redo kann).

Stand 2011 war, dass der Support für die API per EMFEditObservables aber auslaufen soll und man nur noch über die Properties-API arbeiten soll:

https://www.eclipse.org/forums/index.php/t/263874/

Die EMF Edit Properties-API ist hier eingeführt:
http://tomsondev.bestsolution.at/2009/06/07/galileo-emf-databinding-part-2/

Leider mit einem Beispiel, das hochgradig optimiert (sprich auch verkapselt) ist und noch diverse Tricks und Kniffe beinhaltet, was es schwer macht, das Essentielle zu sehen. Das Beispiel ist aber Teil der Eclipse-Repos (org.eclipse.emf.examples.databinding.project), sodass ich mir das mal runterladen und versuchen werde, darauf das Databinding aufzusetzen.


----------

