EMF - EditingDomain/CommandStack

Bitte aktiviere JavaScript!
Hi Leute!

#1: Danke nochmal Sir Wayne für den Fred, du hattest ja genau das selbe Problem wie ich... Die schlechte Nachricht ist aber: ich konnte es bisher noch nicht lösen...

Hier nochmal der Ansatz:

View 1 enthält nen TableViewer, welcher mehrere Personen hält.
Eine Person hat gewisse fixe Attribute (Vor-, Nachname) aber auch Listen (mehrere Adressen (Str/Plz/Ort) oder Kontaktmöglichkeiten (Vorwahl/Nr/Enum Typ).

View 2 enthält die Bearbeitungsmöglichkeiten, also einige Felder, welche via Databinding ans Modell gebunden sind. Zusätzlich sind 2 ListViewer dabei, welche die ELists Adressen und Kontakt halten.

Fall 1: Änderung eines "fixen" Attributes: sofortige Übernahme in die View 1 - Tabelle
Fall 2: Hinzufügen einer Adresse/Kontakt in der View 2: sofortige Übernahme in die View 1 - Tabelle
Fall 3:Fall 2 mit löschen - selbes Ergebnis wie Fall 2
Fall 4: Ändern der Details einer Adresse - Übernahme in View 1 erst nach manuellem refresh auf den TableViewer.

so, wie hab ich das jetzt gebunden:
View 1 - Tabelle:
Code:
adapterFactory = new MitgliederItemProviderAdapterFactory();
Code:
tableViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
Code:
tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));
Code:
tableViewer.setInput(mitglieder);
View 2 - AdressenListViewer
Code:
lvAdressen.setContentProvider(new ObservableListContentProvider());
Code:
WritableList input = new WritableList(aktPerson.getAdressen(), Adresse.class);
Code:
lvAdressen.setInput(input);
bzw.
Java:
		AdapterFactory adapterFactory = new MitgliederItemProviderAdapterFactory();

		lvKontaktnummern.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
		lvKontaktnummern.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));

		lvKontaktnummern.setInput(aktMitglied); 
		
		lvKontaktnummern.setLabelProvider(new LabelProvider() {
	        public Image getImage(Object element) {
	          return null;
	        }

	        public String getText(Object element) {
	        	System.out.println("Labelprovider: " + element.getClass().getName());
	        	if(element instanceof TelefonImpl)
	        		return element.toString();
	        	else
	        		return null;
	        }
	      });
Die im View2 gegangenen Wege führen zum exakt selben Ergebnis, die WritableList wird wieder entfernt und durch die eigenen Provider ersetzt. Wollte nur alle Wege probieren. Habe auch versucht, bei allen 3 Binds die gleiche
Code:
AdapterFactory adapterFactory = new MitgliederItemProviderAdapterFactory();
zu verwenden... ändert leider auch nix.

denke, dass ich die Childeinstellungen richtig habe sowie die Containment Einstellungen. Neues GenModel erstellt und neu generiert -> brachte auch nix. Jetzt bin ich erstmal Ratlos... :rtfm::autsch:

---

Zweites Problem: was ich ursprünglich hatte, dass ich in Dialogen eigene Objekte bearbeiten wollte, welche ich bei bedarf wieder verwerfen können will.

Erster Ansatz war es, dass ich ein Objekt bekomme (
Code:
aktuellePerson
) und diese dann mittels Copy (
Code:
duplikatPerson = EcoreUtil.copy(aktuellePerson);
) kopiere, bearbeite und dann entweder bei Dialog.OK
Code:
EcoreUtil.replace(aktuellePerson, duplikatPerson );
oder eben einfach nix nachliefern. Ich bilde mir fest ein, das hat mal funktioniert, aber als ichs Zuhause ausprogrammiert hab, wollte ers ums verrecken nicht replacen. Hab imo auch umkopieren und überschreiben probiert, funktioniert hat nix.

Also hab ich an WildCards Lösung mit dem CommandStack gedacht (Post 6 "Bei 'save' wendest du dann alle Commands aus dem Stack der View auf das orignal Modell an."). Habe aber keine Möglichkeit gefunden, wie ich das Ziel der Commands im Stack vom dupPerson auf die aktPerson umdrehen könnt.
Leider hab ich auch keine vernünftige Möglichkeit gefunden, den CommandStack bis zu einem gewissen Punkt zurückzuspringen (Beispiel: Wizard, der zuerst Stammdaten und dann Adressen macht. Stammdaten 3 Änderungen, dann sozusagen ein Savepoint, +x Adressänderungen, die alle undoable wären, sodass nurmehr die initialen 3 Stammdatenänderungen am Stack wären, und weiters, falls Dialog.ok diese [alles] übernehmen oder Dialog.Cancel -> undoAll)

Habs jetzt so gelöst, dass jeder Teilbereich einen eigenen CommandStackListener hat, der die Änderungen des Teilbereiches mitzählt, und diese dann undo't... imo auch nicht sehr sauber. gibtz da ne bessere Möglichkeit bzw hab ich einfach die richtigen Commands übersehen?

Danke mal soweit, vor allem das erste Problem mit dem fehlenden Aktualisieren über die 2te Ebene nervt sehr :/ wünsch euch allen was, lg

ps.: habe auch versucht, einen Teil der Adresse (einfach ersten Listeneintrag->Strasse genommen) an ein Textfeld direkt zu binden, hat auch nicht besser funktioniert... bei allen Lösungen ist nach einen refresh alles richtig, nur ohne halt nicht :/
 
G

Gast2

Mach doch erstmal ein einfaches EMFModel und probier eine einfache Tabelle mit EMFBinding anzubinden und nicht zuviel auf einmal zu machen.

Du kannst soviele Fehler gemacht haben ist schwer jetzt was dazu zu sagen...
 
Hallo zusammen,
ich habe eine Frage bitte bezüglich EMF Forms.

Ich bin bis jetzt dazu bekommen, dass ich aus einer XSD ein Listobjekt nun nur Pull-Down-Menü in EMF Forms bekomme, und das wäre die Fragestellung, wie ich aus einer XSD eine ListBox in EMF Forms bekommen kann?
Ist das möglich? Oder es ist schon so festgelegt?

Außerdem könnte man die UI nach der Erstellung irgendwie als XML Beschreibung (Also XML Datei) abspeichern?

Ich bedanke mich im Voraus für eure Antwort und Unterstützung.

Beste Grüße
Alan Jaff
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben