Databinding in Galileo

Die neue Properties API.

Ich sitze hier gerade in einem Regionalzug auf dem Weg ins Allgäu und habe mir gedacht, ich nutze die Zeit (3 Stunden fahrzeit von München aus), um mir
einige neue Features von Galileo anzuschauen.

Das Thema Databinding interessiert mich sehr, zum Einen weil ich im aktuellen Projekt sehr viel damit zu tun habe,
zum Anderen weil ich es als essentiellen Besandteil einer RCP-Anwendung betrachte
Ich habe mir aus diesem Grund kürzlich die neue Properties-API in Galileo zu
Gemüte geführt.

Was ändert sich für den gemeinen Entwickler?

Im Prinzip erst mal nichts, alles wird einfacher, schneller , besser.

Schauen wir uns hierzu einige Beispiele an:

1. Das Binding eines Textfeldes an eine ModelProperty.

Bisher:
Text text = new Text(parent, SWT.BORDER);
Person person = new Person(„Mueller“, „Hans“, „Bertholdweg 7“, „88279“,
„Amtzell“);
DataBindingContext ctx = new DataBindingContext();
ctx.bindValue(SWTObservables.observeText(text, SWT.Modify),

Zunächst mal fällt der längst überfällige Schritt auf, dass man auch ohne Übergabe einer UpdateValueStrategy
ein Binding anlegen kann (man beachte das bisher in 3.4 immer notwendige null,null **gähn**)

Das anlegen von Bindings über die Properties-API würde so aussehn (Die Properties-API wird übrigens
mittlerweile auch von allen Klassen wie BeanObservables, SWTOBservables etc. intern verwendet).

ctx.bindValue(WidgetProperties.text(SWT.Modify).observe(text),
BeanProperties.value(„vorname“).observe(person));

Zunächst mal scheint es so, als wäre nicht viel gewonnen, der zu schreibende Code ist im Prinzip erst
mal fast gleich.

Ganz ähnlich sieht die Sache aus, wenn man Viewer verwendet:
ComboViewer viewer = new ComboViewer(parent, SWT.NONE);
viewer.setInput(new String[] { „Herr“, „Frau“, „Dr.“, „Prof.“ });
viewer.setLabelProvider(new LabelProvider());
viewer.setContentProvider(new ArrayContentProvider());

ctx.bindValue(ViewerProperties.singleSelection().observe(viewer),
BeanProperties.value(„anrede“).observe(model));

Machen wir das ganze mal etwas dynamisch, die Klasse Person kriegt wie eigentlich in allen meinen Beispielen
Child-Objekte 🙂
Was wir jetzt machen möchten ist, die ChildObjekte in einer Liste anzeigen, und zwar jeweils mit dem Vornamen.
Bisher würde man das in etwa so realisieren:
ListViewer viewer = new ListViewer(parent);
ObservableListContentProvider cp = new ObservableListContentProvider();
viewer.setContentProvider(cp);
ObservableMapLabelProvider lp = new ObservableMapLabelProvider(
BeansObservables.observeMap(cp.getKnownElements(), „vorname“));
viewer.setLabelProvider(lp);
viewer.setInput(BeansObservables.observeList(model, „children“));

mit der Properties-API sieht das in ungefähr so aus:
ctx.bindValue(ViewerProperties.input().observe(viewer), new WritableValue(BeanProperties
.list(„children“).values(„vorname“).observe(model),IObservableList.class));

Was hierbei richtig cool ist ist die Kaskadierung der Properties:
BeanProperties.list(„children“).values(„vorname“).observe(model)

Hier wird im Prinzip zuerst eine ObservableListProperty aus der Children-Liste generiert, und anschliessend direkt
auf dieser ListProperty eine weitere ValueProperty erzeugt, die den Vornamen observiert.
Das kann man theoretisch endlos weitertreiben. Einfacher gehts nicht, intern wird ein Master-Detail Binding erzeugt,
welches die observierte Liste (children) mit den Values verknüpft.
Es würde jetzt also, wenn sich ein Vorname eines Childs ändert, diese Änderung direkt in dem
Viewer widergespiegelt werden.

Da bleibt mir nur, viel Spass mit Databinding, ich seh hier goldene Zeiten auf uns zukommen…

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s