Gewohnt, XML zur Speicherung meiner Daten Modelle zu verwalten, sagte ich: "Nun, für einmal schauen, was gibt der EMF" ...
Und ich bin nicht enttäuscht über alles! Es hat mich gerettet geraumer Zeit :)

EMF, was ist das?

Nach der offiziellen Website : "Die EMF-Projekt ist ein Rahmen für die Modellierung und Codegenerierung Fazilität für den Aufbau Tools und anderen Anwendungen Modell basiert auf einem strukturierten Daten. Von einem Modell-Spezifikation beschrieben "in XMI, EMF Stellt Tools und Runtime-Unterstützung für die Anfertigung des Modells eine Reihe von Java-Klassen für die, zusammen mit einer Reihe von Maß-Klassen ermöglichen, Anzeigen und Befehl,-basierte Bearbeitung des Modells und eine Basic-Editor."

Ecore Diagramm oder Grafik Beschreibung eines Modells

EMF bietet in Inkubationszeit (aber es funktioniert sehr gut), das Teilprojekt "Ecore Diagram" zu beschreiben, die grafische Ecore Modell:

ECore Diagram

Sobald das Modell beschrieben, es bleibt nur zu generieren, der Java-Code ...

So New> Sonstiges> EMF Model Generator. Er zeigt unser Modell ecore poof, zeigt es wieder unser Modell, sondern als einen Verzeichnisbaum:

Editeur Genmodel Es rechten Maustaste auf die Wurzel, die uns erlaubt:

  • Generate Model Code
  • Code generieren, um das Modell bearbeiten
  • Generate Code-Editor
  • Generate Code zu testen das Modell
  • Generate All

Denn jetzt, denke ich, was mich interessiert, das Template-Code ... und hier bin ich mit einer Punktzahl von Klassen (Interface & Umsetzung) ist, die Fabriken ...

Große, nicht eine einzige Zeile Code geschrieben und ich kann schon lesen und schreiben Daten ...

Lesen und schreiben ihre EMF-Modell

Nach ein wenig Recherche-Code, das ist etwas zu lesen und zu schreiben, ein Modell

/ ** Die Ressource-Modell verwendet, um den Laden. *
  1. private Resource Ressource;
  2. / **
  3. * Legen Sie die Ressource zugeordnet, um ein Modell.
  4. *
  5. * @ Param Die Datei pFile.
  6. * @ Return Die damit verbundenen Ressourcen.
  7. *
  8. final File pFile ) { private Resource Last (endgültige Datei pFile) (
  9. ; ResourceSet lResourceSet ResourceSetImpl = new ();
  10. / / Das entsprechende Register "Ressourcen-Fabrik zu verarbeiten alle Erweiterungen Datei.
  11. . getExtensionToFactoryMap ( ) . put ( Resource. Factory . Registry . DEFAULT_EXTENSION , lResourceSet. getResourceFactoryRegistry (). getExtensionToFactoryMap (). put (Resource. Factory. Registry. DEFAULT_EXTENSION,
  12. ; New XMIResourceFactoryImpl ());
  13. / / Registrieren des Pakets zu gewährleisten, ist es möglich beim Beladen.
  14. . put ( ModelPackage. eNS_URI , ModelPackage. eINSTANCE ) ; lResourceSet. getPackageRegistry (). put (ModelPackage. eNS_URI, ModelPackage. eINSTANCE);
  15. / / Holen Sie sich die URI der Modell-Datei.
  16. pFile. getAbsolutePath ( ) ) ; LFileURI URI = URI. CreateFileURI (pFile. getAbsolutePath ());
  17. / / Erstellen Sie eine Ressource für diese Datei.
  18. ( lFileURI ) ; lResourceSet zurückzukehren. CreateResource (lFileURI);
  19. )
  20. / **
  21. * Legen Sie das Modell.
  22. *
  23. * @ Param Die Datei pFile.
  24. * @ Return Das zugehörige Modell.
  25. * @ Throws IOException IO Error.
  26. *
  27. File pFile ) throws IOException { Öffentliche SequenceProject loadModel (File pFile) throws IOException (
  28. pFile ) ; resource = EMFUtils. load (pFile);
  29. pFile. exists ( ) ) { if (pFile. exists ()) (
  30. new HashMap ( ) ) ; Ressource. load (neue HashMap ());
  31. )
  32. SequenceProject lSequenceProject;
  33. resource. getContents ( ) . isEmpty ( ) ) { if (resource. getContents (). isEmpty ()) (
  34. ( ) ; lSequenceProject = ModelFactory. eINSTANCE. createSequenceProject ();
  35. . add ( lSequenceProject ) ; Ressource. getContents (). add (lSequenceProject);
  36. )
  37. andere (
  38. lSequenceProject = null;
  39. EObject lObj : resource. getContents ( ) ) { for (EObject lObj: Ressource. getContents ()) (
  40. lObj instanceof SequenceProject ) { if (instanceof lObj SequenceProject) (
  41. lObj ; lSequenceProject = (SequenceProject) lObj;
  42. break;
  43. )
  44. )
  45. )
  46. lSequenceProject zurückzukehren;
  47. )
  48. / **
  49. * Speichern Sie das Modell.
  50. *
  51. * @ Throws IOException Fehler.
  52. *
  53. ) @ SuppressWarnings ("deaktiviert")
  54. save ( ) throws IOException { public void save () throws IOException (
  55. new HashMap ( ) ) ; Ressource. save (neue HashMap ());
  56. )

SWT und Databinding

Nun bleibt nur noch die SWT Muster ... und dann, Draht Dankeschön an DataBinding, weil es (fast) nichts zu tun!

In der Tat, die Entwickler von EMF und SWT hatte die Weitsicht, einen Mechanismus geben, um die Initialisierung und Sicherung von Textfeldern zu vermeiden, Menüs, Listen, wenn eine EMF-Modell verknüpft.

Dies sind die Abhängigkeiten für das Modell benötigt:

  • org.eclipse.emf.ecore
  • org.eclipse.emf.ecore.xmi

... Und für die Datenbindung:

  • org.eclipse.core.databinding.beans
  • org.eclipse.emf.databinding
  • org.eclipse.jface.databinding

denen wir die Tragschicht (org.eclipse.ui, fügen org.eclipse.ui.forms ...)

Die Verknüpfung der grundlegenden Widgets

Dann nur, um anzugeben, bei der Erstellung des SWT-Widget, dass sie angeschlossen werden müssen:

LTEXT text = toolkit.createText (pParent, "");
  1. new GridData ( GridData. FILL_HORIZONTAL ) ) ; LTEXT. SetLayoutData (neu GridData (GridData. FILL_HORIZONTAL));
  2. ) ; Bindels (LTEXT "filmname");

wo bindElement ist eine magische Methode zur Datenbindung ... Gib ihm das Element ( EObject ) enthält das Feld zu binden und den Namen des Feldes.

Hier sind einige Beispiele für Implementierungen:

/ ** Die Daten verbindlichen Rahmen. *
  1. DataBindingContext ( ) ; geschützt DataBindingContext dataBindingContext DataBindingContext = new ();
  2. / **
  3. * Binden Sie die UI-Element, um die EMF-Element.
  4. *
  5. * @ Param pControl Die UI-Element.
  6. * @ Param pField Die EObject Feld.
  7. *
  8. bindElement ( final Combo pControl, final String pField ) { protected void Bindels (Final Combo pControl, final String pField) (
  9. pControl ) ; IObservableValue lUIElement = SWTObservables. ObserveSelection (pControl);
  10. getEObject ( ) , pField ) ; IObservableValue lModelElement = BeansObservables. ObserveValue (getEObject (), pField);
  11. lUIElement, lModelElement, null , null ) ; dataBindingContext. bindValue (lUIElement, lModelElement, null, null);
  12. )
  13. / **
  14. * Binden Sie die UI-Element, um die EMF-Element.
  15. *
  16. * @ Param pControl Die UI-Element.
  17. * @ Param pField Die EObject Feld.
  18. *
  19. bindElement ( final ComboViewer pControl, final String pField ) { protected void Bindels (final ComboViewer pControl, final String pField) (
  20. pControl ) ; IObservableValue lUIElement = ViewersObservables. ObserveSingleSelection (pControl);
  21. getEObject ( ) , pField ) ; IObservableValue lModelElement = BeansObservables. ObserveValue (getEObject (), pField);
  22. lUIElement, lModelElement, null , null ) ; dataBindingContext. bindValue (lUIElement, lModelElement, null, null);
  23. )
  24. / **
  25. * Binden Sie die UI-Element, um die EMF-Element.
  26. *
  27. * @ Param pControl Die UI-Element.
  28. * @ Param pField Die EObject Feld.
  29. *
  30. bindElement ( final Text pControl, final String pField ) { protected void Bindels (pControl endgültigen Text, final String pField) (
  31. pControl, SWT. Modify ) ; ISWTObservableValue lUIElement = SWTObservables. ObserveText (pControl, SWT. Modify);
  32. getEObject ( ) , pField ) ; IObservableValue lModelElement = BeansObservables. ObserveValue (getEObject (), pField);
  33. lUIElement, lModelElement, null , null ) ; dataBindingContext. bindValue (lUIElement, lModelElement, null, null);
  34. )

Link-Liste

Ca, es funktioniert für die grundlegende Widgets für Listen ... ist aber (ein wenig) komplizierter ... naja, so wenig ...

Tatsächlich gibt die DataBinding uns der Content-Provider ( ObservableListContentProvider ) und Eingang ( WritableList aber es war das gleiche für Set und Map) für das Label-Anbieter ist wie üblich ...

ListView Betrachter = new ListView (lComp);
  1. new ObservableListContentProvider ( ) ) ; Betrachter. setContentProvider (neu ObservableListContentProvider ());
  2. new LabelProvider ( ) ) ; Betrachter. setLabelProvider (neu LabelProvider ());
  3. getInputList ( ) , getEObjectClass ( ) ) ; input = new WritableList (getInputList (), getEObjectClass ());
  4. input ) ; Betrachter. setInput (Input);

Und nun, zum Hinzufügen / Entfernen eines Objekts aus der Liste, tun Sie es einfach auf den Eingang (keine Notwendigkeit, den Betrachter geschieht automatisch benachrichtigt):

input.add (myElement);
  1. myElement ) ; Input. remove (myElement);

... Und das Modell wird automatisch aktualisiert!

Das ist etwa der Operation ... Ich kann jetzt mit EMF Query zu spielen, und ich werde die Ergebnisse meiner Forschung post :)

In Verbindung stehende Artikel