# EMF und Tabbed Properties View



## mandypb86 (26. Okt 2011)

Hallo zusammen,

ich hab mich gerade in die TabbedPropertySheets eingelesen und das Beispiel nachvollzogen und nachgebaut.

Ich möchte diese TabbedPropertySheets gerne in meiner EMF-Anwendung benutzen. Habe auch schon die 3 Extensionpoints angelegt und entsprechend konfiguriert, sowie eine Section angelegt und die createControls() Methode überschrieben. Meine Properties-View bleibt aber leer.

Ich benutze in der Section-Klasse meine Model-Klasse (bzw. das Interface, also A, nicht AImpl) bei der setInput()-Methode.


```
public void setInput(IWorkbenchPart part, ISelection selection) {
	super.setInput(part, selection);
	Assert.isTrue(selection instanceof IStructuredSelection);
        Object input = ((IStructuredSelection) selection).getFirstElement();
        Assert.isTrue(input instanceof A);
        this.a = (A)input; // die Variable a gibt es natürlich
	}
```

Wenn ich die PropertyView richtig verstanden hab, dann erwartet diese eine IPropertySource. Diese wird aber nur von dem AItemProvider in EMF implementiert.

Was muss ich in der setInput()-Methode denn nun abfragen
bzw. ganz allgemein
wie erreiche ich es, dass die TabbedPropertiesView auf mein A-Objekt reagiert und ich dieses auslesen/nutzen kann?

Auf baldige Antworten freut sich
M@ndy


----------



## Wildcard (26. Okt 2011)

IPropertySource brauchst du nur für die klassische Tabellenansicht. Wenn du eigene Widgets erzeugst und bindest, benötigst du das nicht.


----------



## mandypb86 (27. Okt 2011)

Dann verstehe ich nicht, wieso die PorpertiesView nicht auf meine Selection der anderen View reagiert.

Man gibt dem ExtensionPoint bla.bla.Contributor doch eine ViewID, die Selections für die TabbedProperties zur Verfügung stellt. Nennen wir sie mal LView.
In dieser LView hab ich einen TableViewer, der als input eine (EMF-Model)-Klasse O bekommt. Die Children L dieser Klasse O werden in meinem TableViewer auch einwandfrei geladen und dargestellt.

Diesen TableViewer muss ich ja jetzt als SelectionProvider registrieren. Hab ich in der createControls() am Ende gemacht mittels

```
getSite().setSelectionProvider(tv); // tv ist der TableViewer
```

Ein Klick auf eine Tabellenzeile müsste mir nun doch eigentlich eine StructuredSelection mit beinhaltetem Objekt des Typs L liefern oder nicht?
Und auf genau diesen Typ L frag ich doch in meiner TabbedProperties-Section Klasse in der setInput()-Methode ab.

Muss meine TabbedPropertiesView jetzt noch explizit auf meine View lauschen? Macht sie doch eigentlich sowieso.

Was mache ich falsch, bzw. wo liegt mein Denkfehler?

EDIT: Ich hatte vergessen, das ITabbedPropertySheetPageContributor Interface in meine View einzubinden und die entsprechende getContributorId()-Methode zu überschreiben. Hat aber auch nichts geholfen. Meine PropertiesView zeigt immer noch die leere normale Tabellenansicht.


----------



## mandypb86 (27. Okt 2011)

EDIT 2: Man sollte wirklich ALLES lesen und befolgen, wenn man es in sein eigenes Projekt einbaut.
Hab die getAdapter()-Methode in der View natürlich auch vergessen.

```
public Object getAdapter(Class adapter) {
        if (adapter == IPropertySheetPage.class)
            return new TabbedPropertySheetPage(this);
        return super.getAdapter(adapter);
}
```

Es sind einfach diesen vielen Kleinigkeiten, die RCP/EMF etc. manchmal aufwendig und nervig machen.

Also für alle, die was Ähnliches vorhaben:

Die View muss das ITabbedPropertySheetPageContributor-Interface implementieren und somit die getContributorId()-Methode. Diese gibt am Besten die ID zurück, die man in dem ExtensionPoint angegeben hat.

Desweiteren muss es eine getAdapter()-Methode in der View geben, die ein TabbedPropertySheetPage-Objekt zurückgibt (s.o.)

Über die IPropertySource muss man sich wirklich keine Gedanken machen, wie Wildcard schon erwähnte (Danke). Einfach in der setInput()-Methode der jeweiligen Section zunächst auf die StructuredSelection(bei JFace-Viewern) casten und danach das erste Element aus der Selection holen und auf das casten, was eigentlich drin sein sollte (in meinem Fall Klasse L).

Dann natürlich die ganzen ExtensionPoints anständig füttern und schon geht das.

Lieben Gruß
M@ndy


----------



## Wildcard (27. Okt 2011)

> Es sind einfach diesen vielen Kleinigkeiten, die RCP/EMF etc. manchmal aufwendig und nervig machen.


Mit EMF hat das nichts zu tun, aber recht hast du natürlich trotzdem.
Allerdings musst du auch gegenüberhalten wie lange es dich kosten würde eine gleichwertige Anwendung ohne RCP/EMF zu produzieren, dann relativiert sich das sehr schnell.
Bei Eclipse RCP dreht sich alles um Erfahrung, beim nächsten mal weißt du es besser und hast dein Portfolio wieder erweitert.


----------

