Hi Leute,
mein Datenmodell sieht folgendermaßen aus:
Band hat einen Namen und 0...n Albem. Jedes Album hat wiederum einen Namen und 0..n Songs. Jeder Song hat ebenfalls einen Namen und eine Länge. Da ich im Moment von einer Band ausgehe, habe ich eine wunderbare Baumstruktur. Die Band als Root, darunter die Alben und darunter die Songs. Soweit so gut. Für jedes Objekt (Band, Album, Song) habe ich mir eine Klasse mit den entsprechenden Eigenschaften angelegt. Auch wunderbar.
Nun möchte ich diese Struktur an einen TreeViewer binden. Dazu habe ich mir folgende Klasse gebaut:
In dem Part werden leider nur die Alben angezeigt, weder die Band als Root-Knoten noch die in den Alben gespeicherten Songs werden angezeigt. Wo liegt mein Fehler?
Danke für jede Hilfe,
Andreas
edit:
Okay, wenn man die Songs den Alben hinzufuegt und einen eigenen LabelProvider schreibt, geht es. Zumindest zeigt er die Alben und die Songs an. Bleiben also 2 Fragen:
1. Warum zeigt er den root Node nicht an?
2. Komme ich um den eigenen LabelProvider herum?
mein Datenmodell sieht folgendermaßen aus:
Band hat einen Namen und 0...n Albem. Jedes Album hat wiederum einen Namen und 0..n Songs. Jeder Song hat ebenfalls einen Namen und eine Länge. Da ich im Moment von einer Band ausgehe, habe ich eine wunderbare Baumstruktur. Die Band als Root, darunter die Alben und darunter die Songs. Soweit so gut. Für jedes Objekt (Band, Album, Song) habe ich mir eine Klasse mit den entsprechenden Eigenschaften angelegt. Auch wunderbar.
Nun möchte ich diese Struktur an einen TreeViewer binden. Dazu habe ich mir folgende Klasse gebaut:
Java:
package de.kba.agrund.experiments.treeviewerbinding.view.part;
import javax.inject.Inject;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.beans.IBeanValueProperty;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.list.WritableList;
import org.eclipse.core.databinding.property.list.DelegatingListProperty;
import org.eclipse.core.databinding.property.list.IListProperty;
import org.eclipse.core.databinding.property.value.IValueProperty;
import org.eclipse.jface.databinding.viewers.ViewerSupport;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import de.kba.agrund.experiments.treeviewerbinding.model.IAlbum;
import de.kba.agrund.experiments.treeviewerbinding.model.IBand;
import de.kba.agrund.experiments.treeviewerbinding.model.ISong;
import de.kba.agrund.experiments.treeviewerbinding.model.impl.AlbumImpl;
import de.kba.agrund.experiments.treeviewerbinding.model.impl.BandImpl;
import de.kba.agrund.experiments.treeviewerbinding.model.impl.SongImpl;
public class BandTreePart {
private Composite parent;
@Inject
public BandTreePart(Composite parent) {
this.parent = parent;
buildUI();
}
private void buildUI() {
TreeViewer viewer = new TreeViewer(this.parent, SWT.FULL_SELECTION);
viewer.setUseHashlookup(true);
IBand band = buildBand();
initBinding(band, viewer);
}
private void initBinding(IBand band, TreeViewer treeViewer) {
IBeanValueProperty returnTextPropertyValue = BeanProperties.value(
IAlbum.class, "albumName");
IListProperty listProperty = getListProperty();
ViewerSupport.bind(treeViewer, band, listProperty,
returnTextPropertyValue);
IValueProperty
}
private IListProperty getListProperty() {
IListProperty result = new DelegatingListProperty() {
private IListProperty inputProperty = BeanProperties.list(
IBand.class, "albums");
private IListProperty elementChildren = BeanProperties.list(
IAlbum.class, "songs");
@Override
protected IListProperty doGetDelegate(Object source) {
if (source instanceof IBand) {
return inputProperty;
} else if (source instanceof IAlbum) {
return elementChildren;
} else {
return null;
}
}
};
return result;
}
private IBand buildBand() {
IBand band = new BandImpl();
band.setBandName("U2");
IObservableList albumList = buildAlbumList(3);
band.setAlbums(albumList);
return band;
}
private IObservableList buildAlbumList(int anzAlben) {
IObservableList albumList = new WritableList();
for (int i = 1; i <= anzAlben; i++) {
IAlbum album = buildAlbum(i * 5);
albumList.add(album);
}
return albumList;
}
private IAlbum buildAlbum(int anzSong) {
IAlbum album = new AlbumImpl();
album.setAlbumName("Album " + (anzSong / 5));
IObservableList songList = new WritableList();
for (int i = 0; i < anzSong; i++) {
ISong song = buildSong(i);
songList.add(song);
}
album.setSongs(songList); // Diese Zeile fehlte...
return album;
}
private ISong buildSong(int i) {
ISong song = new SongImpl();
song.setSongName("Song " + i);
song.setLength(i * 60);
return song;
}
}
In dem Part werden leider nur die Alben angezeigt, weder die Band als Root-Knoten noch die in den Alben gespeicherten Songs werden angezeigt. Wo liegt mein Fehler?
Danke für jede Hilfe,
Andreas
edit:
Okay, wenn man die Songs den Alben hinzufuegt und einen eigenen LabelProvider schreibt, geht es. Zumindest zeigt er die Alben und die Songs an. Bleiben also 2 Fragen:
1. Warum zeigt er den root Node nicht an?
2. Komme ich um den eigenen LabelProvider herum?
Zuletzt bearbeitet: