package application.recordings.view; import com.google.common.base.Function; import com.google.common.collect.Lists; import com.sun.javafx.collections.ObservableListWrapper; import domain.Episode; import domain.Recording; import domain.Season; import domain.Series; import javafx.scene.control.TableCell; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.layout.Pane; import javafx.util.Callback; import org.joda.time.DateTime; import view.SubordinatingView; import java.util.Collection; public class RecordingsView implements SubordinatingView{ private final TableView<Recording> table = new TableView<>(); private final TableColumn<Recording, Series> seriesColumn = new TableColumn<>(); private final TableColumn<Recording, Season> seasonColumn = new TableColumn<>(); private final TableColumn<Recording, Episode> episodeColumn = new TableColumn<>(); private final TableColumn<Recording, DateTime> airedColumn = new TableColumn<>(); public RecordingsView() { seriesColumn.setCellValueFactory(new DelegatingProvider<>(new Function<Recording, Series>() { @Override public Series apply(Recording input) { return input.series; } })); seriesColumn.setCellFactory(new Callback<TableColumn<Recording, Series>, TableCell<Recording, Series>>() { @Override public TableCell<Recording, Series> call(TableColumn<Recording, Series> recordingSeriesTableColumn) { return new SeriesCell(); } }); seriesColumn.setText("series"); seasonColumn.setCellValueFactory(new DelegatingProvider<>(new Function<Recording, Season>() { @Override public Season apply(Recording input) { return input.season; } })); seasonColumn.setCellFactory(new Callback<TableColumn<Recording, Season>, TableCell<Recording, Season>>() { @Override public TableCell<Recording, Season> call(TableColumn<Recording, Season> recordingSeasonTableColumn) { return new SeasonCell(); } }); seasonColumn.setText("season"); episodeColumn.setCellValueFactory(new DelegatingProvider<>(new Function<Recording, Episode>() { @Override public Episode apply(Recording input) { return input.episode; } })); episodeColumn.setCellFactory(new Callback<TableColumn<Recording, Episode>, TableCell<Recording, Episode>>() { @Override public TableCell<Recording, Episode> call(TableColumn<Recording, Episode> recordingEpisodeTableColumn) { return new EpisodeTableCell(); } }); episodeColumn.setText("episode"); airedColumn.setCellValueFactory(new DelegatingProvider<>(new Function<Recording, DateTime>() { @Override public DateTime apply( Recording input) { return input.aired; } })); airedColumn.setCellFactory(new Callback<TableColumn<Recording, DateTime>, TableCell<Recording, DateTime>>() { @Override public TableCell<Recording, DateTime> call(TableColumn<Recording, DateTime> recordingDateTimeTableColumn) { return new AirDateCell(); } }); airedColumn.setText("airtime"); table.getColumns().add(seriesColumn); table.getColumns().add(seasonColumn); table.getColumns().add(episodeColumn); table.getColumns().add(airedColumn); } public void display(Collection<Recording> recordings) { table.setItems(new ObservableListWrapper<>(Lists.newArrayList(recordings))); } @Override public void addTo(Pane pane) { pane.getChildren().add(table); } }