Hallo mal wieder,
hab mich nach meinen letzten Fragen etwas mehr in die Materie eingelesen und auch schon einige Dinge auf die Reihe bekommen. Jetzt steh ich grad vor dem Problem, dass ich meine bisher direkten Bindings gerne dahingehend ändern würde, dass alles über einen CommandStack läuft, um z.B. eine Speichern/Verwerfen Funktionalität zu bekommen.
Hier mal eine meiner Klassen, sie stellt ein Composite zur Verfügung, in der eine meiner EMF-Klassen bearbeitet werden kann (Stammdaten). Hat den Hintergrund, dass dieses Composite dann je nach dem auf ner View oder einem Dialog oder wo auch immer platziert wird, und das übergebene Objekt bearbeiten soll.
Fragen dazu:
- Gibt es wo eine verständlichere Anleitung als das, was auf Tom Schindls Blog ist? Das war mir etwas zu weit verzahnt, als dass ich es problemlos verstanden hätte...
Ein simples Beispiel mit Person Vorname/Nachname und einer View, wo beides mittels "Speichern" verarbeitet wird, würde auch voll reichen... nur das was ich bisher gesehn hab, war mir zu komplex
- Ist der restliche Ansatz mit dem Databinding richtig, oder mache ich hier auch irgendwo Fehler? Funktionieren tut alles wie gewünscht, aber ich weiss nicht, ob ich nicht eventuell daten irgendwie am Modell vorbeischmuggle oder so...
Zusatzfrage:
Ich hab in meinem Modell eine Länder Klasse, welche eine Liste aus einzelnen Land objekten hält. Diese benutze ich, um alle möglichen Links herzustellen wie Staatsbürgerschaft, Telefonvorwahlen, etc. Um auf diese Länder-Liste zugreifen zu können, habe ich sie in einen kleinen Model-Provvider ausgelagert... Ich weiss nur nicht, ob das Sinnvoll ist, oder ob ich auch ohne diesen Umweg irgendwie direkt auf die Daten es EMF-Modells zugreifen könnte...
Zugreifen tu ich dann immer über 'Laender laender = ModelProvider.INSTANCE.getLaender();'...
Ist das Sinnvoll oder Blödsinn, weil ich irgendwie direkt auf das EMF zugreifen könnte?
So, das wärs mal fürs erste, kann gern noch mehr Code liefern, falls gewünscht.
Würde mich auf jeden Fall sehr über Antworten freuen,
bis dahin noch schönes WE & lg
O
hab mich nach meinen letzten Fragen etwas mehr in die Materie eingelesen und auch schon einige Dinge auf die Reihe bekommen. Jetzt steh ich grad vor dem Problem, dass ich meine bisher direkten Bindings gerne dahingehend ändern würde, dass alles über einen CommandStack läuft, um z.B. eine Speichern/Verwerfen Funktionalität zu bekommen.
Hier mal eine meiner Klassen, sie stellt ein Composite zur Verfügung, in der eine meiner EMF-Klassen bearbeitet werden kann (Stammdaten). Hat den Hintergrund, dass dieses Composite dann je nach dem auf ner View oder einem Dialog oder wo auch immer platziert wird, und das übergebene Objekt bearbeiten soll.
Java:
public class EditStammdatenPanel extends EditDefault{
private Text txtVorname;
private Text txtNachname;
private DateTime dtGeburtsdatum;
private Text txtEmail;
private Combo cmbStaatsbuergerschaft;
private ComboViewer cvStaatsbuergerschaft;
private Combo cmbAnrede;
private ComboViewer cmbViewer;
private ObservableListContentProvider obsListContentProvider;
public EditStammdatenPanel(Composite _parent, Person _aktPerson, int _spaltenDesPanels) {
super(_parent, _aktPerson);
createPanel(_spaltenDesPanels);
}
public EditStammdatenPanel(Composite _parent, Person _aktPerson, int _spaltenDesPanels, EMFDataBindingContext _emfDataBindingContext) {
this(_parent, _aktPerson, _spaltenDesPanels);
emfDataBindingContext = _emfDataBindingContext;
}
private void createPanel(int spaltenAnzahl) {
Label lblAnrede = new Label(parent, SWT.NONE);
lblAnrede.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblAnrede.setText("Anrede");
cmbViewer = new ComboViewer(parent, SWT.READ_ONLY);
cmbViewer.setContentProvider(new ArrayContentProvider());
cmbViewer.setInput(Anrede.values());
cmbAnrede = cmbViewer.getCombo();
cmbAnrede.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
if(spaltenAnzahl == 4) {
new Label(parent, SWT.NONE);
new Label(parent, SWT.NONE);
}
Label lblVorname = new Label(parent, SWT.NONE);
lblVorname.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblVorname.setText("Vorname");
txtVorname = new Text(parent, SWT.BORDER);
txtVorname.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
Label lblNachname = new Label(parent, SWT.NONE);
lblNachname.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblNachname.setText("Nachname");
txtNachname = new Text(parent, SWT.BORDER);
txtNachname.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
Label lblGeburtsdatum = new Label(parent, SWT.NONE);
lblGeburtsdatum.setText("Geburtsdatum");
dtGeburtsdatum = new DateTime(parent, SWT.BORDER | SWT.DROP_DOWN);
GridData gd_dtGeburtsdatum = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_dtGeburtsdatum.widthHint = 118;
dtGeburtsdatum.setLayoutData(gd_dtGeburtsdatum);
Label lblStaatsbrgerschaft = new Label(parent, SWT.NONE);
lblStaatsbrgerschaft.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblStaatsbrgerschaft.setText("Staatsb\u00FCrgerschaft");
cvStaatsbuergerschaft = new ComboViewer(parent, SWT.READ_ONLY);
obsListContentProvider = new ObservableListContentProvider();
cvStaatsbuergerschaft.setContentProvider(obsListContentProvider);
cmbStaatsbuergerschaft = cvStaatsbuergerschaft.getCombo();
cmbStaatsbuergerschaft.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
Label lblEmail = new Label(parent, SWT.NONE);
lblEmail.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblEmail.setText("Email");
txtEmail = new Text(parent, SWT.BORDER);
txtEmail.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
new Label(parent, SWT.NONE);
new Label(parent, SWT.NONE);
}
@Override
protected void initDataBindings() {
if(emfDataBindingContext == null)
emfDataBindingContext = new EMFDataBindingContext();
IValueProperty valProp = ViewerProperties.singleSelection();
IEMFValueProperty emfValProp = EMFProperties.value(MitgliederPackage.Literals.PERSON__ANREDE);
emfDataBindingContext.bindValue(valProp.observe(cmbViewer), emfValProp.observe(aktPerson));
//
IObservableValue swtObsVal = SWTObservables.observeText(txtVorname, SWT.Modify);
IObservableValue emfObsVal = EMFObservables.observeValue(aktPerson, Literals.PERSON__VORNAME);
System.out.println(aktPerson.toString());
emfDataBindingContext.bindValue(swtObsVal, emfObsVal, null, null);
//
swtObsVal = SWTObservables.observeText(txtNachname, SWT.Modify);
emfObsVal = EMFObservables.observeValue(aktPerson, Literals.PERSON__NACHNAME);
emfDataBindingContext.bindValue(swtObsVal, emfObsVal, null, null);
//
swtObsVal = SWTObservables.observeText(txtEmail, SWT.Modify);
emfObsVal = EMFObservables.observeValue(aktPerson, Literals.PERSON__EMAIL);
emfDataBindingContext.bindValue(swtObsVal, emfObsVal, null, null);
//
//
swtObsVal = SWTObservables.observeSelection(dtGeburtsdatum);
emfValProp = EMFProperties.value(MitgliederPackage.Literals.PERSON__GEBURTSDATUM);
emfDataBindingContext.bindValue(swtObsVal, emfValProp.observe(aktPerson));
//
//
IObservableMap obsMap = EMFProperties.value(Literals.LAND__NAME).observeDetail(obsListContentProvider.getKnownElements());
cvStaatsbuergerschaft.setLabelProvider(new ObservableMapLabelProvider(obsMap));
IEMFListProperty listProp = EMFProperties.list(Literals.LAENDER__LIST_LAENDER);
cvStaatsbuergerschaft.setInput(listProp.observe(laender));
emfValProp = EMFProperties.value(Literals.PERSON__STAATSBUERGERSCHAFT);
valProp = ViewerProperties.singleSelection();
emfDataBindingContext.bindValue(valProp.observe(cvStaatsbuergerschaft),emfValProp.observe(aktPerson));
}
@Override
public void doBinding(Person _Person, EMFDataBindingContext _emfDataBindingContext) {
aktPerson = _Person;
if(emfDataBindingContext != null)
emfDataBindingContext.dispose();
emfDataBindingContext = _emfDataBindingContext;
initDataBindings();
}
}
Java:
public abstract class EditDefault {
protected Composite parent;
protected Person aktPerson;
protected Laender laender;
protected EMFDataBindingContext emfDataBindingContext;
public EditDefault(Composite _parent, Person _aktPerson) {
parent = _parent;
aktPerson = _aktPerson;
laender = ModelProvider.INSTANCE.getLaender();
}
protected abstract void initDataBindings();
public abstract void doBinding(Person _Person, EMFDataBindingContext _emfDataBindingContext);
public void setParent(Composite _parent) {
parent = _parent;
}
public Composite getParent() {
return parent;
}
public void setEMFDataBindingContext(EMFDataBindingContext _emfDBC) {
emfDataBindingContext = _emfDBC;
}
public EMFDataBindingContext getEMFDataBindingContext() {
return emfDataBindingContext;
}
public void setPerson(Person p) {
aktPerson = p;
}
public Person getPerson() {
return aktPerson;
}
}
Fragen dazu:
- Gibt es wo eine verständlichere Anleitung als das, was auf Tom Schindls Blog ist? Das war mir etwas zu weit verzahnt, als dass ich es problemlos verstanden hätte...
Ein simples Beispiel mit Person Vorname/Nachname und einer View, wo beides mittels "Speichern" verarbeitet wird, würde auch voll reichen... nur das was ich bisher gesehn hab, war mir zu komplex
- Ist der restliche Ansatz mit dem Databinding richtig, oder mache ich hier auch irgendwo Fehler? Funktionieren tut alles wie gewünscht, aber ich weiss nicht, ob ich nicht eventuell daten irgendwie am Modell vorbeischmuggle oder so...
Zusatzfrage:
Ich hab in meinem Modell eine Länder Klasse, welche eine Liste aus einzelnen Land objekten hält. Diese benutze ich, um alle möglichen Links herzustellen wie Staatsbürgerschaft, Telefonvorwahlen, etc. Um auf diese Länder-Liste zugreifen zu können, habe ich sie in einen kleinen Model-Provvider ausgelagert... Ich weiss nur nicht, ob das Sinnvoll ist, oder ob ich auch ohne diesen Umweg irgendwie direkt auf die Daten es EMF-Modells zugreifen könnte...
Java:
public enum ModelProvider {
INSTANCE;
private Mitglieder mitglieder;
private Laender laender;
final SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
private ModelProvider() {
mitglieder = MitgliederFactory.eINSTANCE.createMitglieder();
laender = MitgliederFactory.eINSTANCE.createLaender();
Land at = MitgliederFactory.eINSTANCE.createLand();
at.setFahne("at");
at.setName("Österreich");
at.setVorwahl("+43");
laender.getListLaender().add(at);
Land de = MitgliederFactory.eINSTANCE.createLand();
de.setFahne("de");
de.setName("Deutschland");
de.setVorwahl("+49");
laender.getListLaender().add(de);
Adresse adr = MitgliederFactory.eINSTANCE.createAdresse();
adr.setAdressart(Adressarten.HAUPTWOHNSITZ);
adr.setStrasse("111");
adr.setPlz("222");
adr.setOrt("333");
adr.setLand(laender.getListLaender().get(0));
Adresse adr2 = MitgliederFactory.eINSTANCE.createAdresse();
adr2.setAdressart(Adressarten.ZWEITWOHNSITZ);
adr2.setStrasse("STRASSE");
adr2.setPlz("PLZ");
adr2.setOrt("ORT");
adr2.setLand(laender.getListLaender().get(1));
Telefon t = MitgliederFactory.eINSTANCE.createTelefon();
t.setArt(Telefonarten.MOBIL);
t.setNummer("123123");
t.setVorwahl(laender.getListLaender().get(0));
Mitglied m = MitgliederFactory.eINSTANCE.createMitglied();
m.setAnrede(Anrede.HERR);
m.setVorname("1");
m.setNachname("2");
try {
m.setGeburtsdatum(sdf.parse("01.01.1900"));
} catch (ParseException e) {
e.printStackTrace();
}
m.setStaatsbuergerschaft(laender.getListLaender().get(0));
m.getAdressen().add(adr);
m.getTelefonnummern().add(t);
mitglieder.getListMitglieder().add(m);
Mitglied m2 = MitgliederFactory.eINSTANCE.createMitglied();
m2.setAnrede(Anrede.FRAU);
m2.setVorname("1");
m2.setNachname("2");
try {
m2.setGeburtsdatum(sdf.parse("01.01.1900"));
} catch (ParseException e) {
e.printStackTrace();
}
m2.setStaatsbuergerschaft(laender.getListLaender().get(1));
m2.getAdressen().add(adr);
m2.getAdressen().add(adr2);
Partner p = MitgliederFactory.eINSTANCE.createPartner();
p.setAnrede(Anrede.FRAU);
p.setVorname("1");
p.setNachname("2");
p.setStaatsbuergerschaft(laender.getListLaender().get(1));
m.setPartner(p);
mitglieder.getListMitglieder().add(m2);
}
public Mitglieder getMitglieder() {
return mitglieder;
}
public Laender getLaender() {
return laender;
}
}
Zugreifen tu ich dann immer über 'Laender laender = ModelProvider.INSTANCE.getLaender();'...
Ist das Sinnvoll oder Blödsinn, weil ich irgendwie direkt auf das EMF zugreifen könnte?
So, das wärs mal fürs erste, kann gern noch mehr Code liefern, falls gewünscht.
Würde mich auf jeden Fall sehr über Antworten freuen,
bis dahin noch schönes WE & lg
O